blob: 5693b97ac0bc2c359282c276037f8fab7e766c6e [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 +0100354if has('terminal')
355
356func Test_mksession_terminal_shell()
Bram Moolenaar5a4c3082019-12-01 15:23:11 +0100357 CheckFeature quickfix
358
Bram Moolenaar4d8bac82018-03-09 21:33:34 +0100359 terminal
360 mksession! Xtest_mks.out
361 let lines = readfile('Xtest_mks.out')
362 let term_cmd = ''
363 for line in lines
364 if line =~ '^terminal'
365 let term_cmd = line
366 elseif line =~ 'badd.*' . &shell
367 call assert_report('unexpected shell line: ' . line)
368 endif
369 endfor
Bram Moolenaaraa5df7e2019-02-03 14:53:10 +0100370 call assert_match('terminal ++curwin ++cols=\d\+ ++rows=\d\+\s*.*$', term_cmd)
Bram Moolenaar4d8bac82018-03-09 21:33:34 +0100371
Bram Moolenaar7a39dd72019-06-23 00:50:15 +0200372 call StopShellInTerminal(bufnr('%'))
Bram Moolenaar4d8bac82018-03-09 21:33:34 +0100373 call delete('Xtest_mks.out')
374endfunc
375
376func Test_mksession_terminal_no_restore_cmdarg()
377 terminal ++norestore
378 mksession! Xtest_mks.out
379 let lines = readfile('Xtest_mks.out')
380 let term_cmd = ''
381 for line in lines
382 if line =~ '^terminal'
383 call assert_report('session must not restore teminal')
384 endif
385 endfor
386
Bram Moolenaar7a39dd72019-06-23 00:50:15 +0200387 call StopShellInTerminal(bufnr('%'))
Bram Moolenaar4d8bac82018-03-09 21:33:34 +0100388 call delete('Xtest_mks.out')
389endfunc
390
391func Test_mksession_terminal_no_restore_funcarg()
392 call term_start(&shell, {'norestore': 1})
393 mksession! Xtest_mks.out
394 let lines = readfile('Xtest_mks.out')
395 let term_cmd = ''
396 for line in lines
397 if line =~ '^terminal'
398 call assert_report('session must not restore teminal')
399 endif
400 endfor
401
Bram Moolenaar7a39dd72019-06-23 00:50:15 +0200402 call StopShellInTerminal(bufnr('%'))
Bram Moolenaar4d8bac82018-03-09 21:33:34 +0100403 call delete('Xtest_mks.out')
404endfunc
405
406func Test_mksession_terminal_no_restore_func()
407 terminal
408 call term_setrestore(bufnr('%'), 'NONE')
409 mksession! Xtest_mks.out
410 let lines = readfile('Xtest_mks.out')
411 let term_cmd = ''
412 for line in lines
413 if line =~ '^terminal'
414 call assert_report('session must not restore teminal')
415 endif
416 endfor
417
Bram Moolenaar7a39dd72019-06-23 00:50:15 +0200418 call StopShellInTerminal(bufnr('%'))
Bram Moolenaar4d8bac82018-03-09 21:33:34 +0100419 call delete('Xtest_mks.out')
420endfunc
421
422func Test_mksession_terminal_no_ssop()
423 terminal
424 set sessionoptions-=terminal
425 mksession! Xtest_mks.out
426 let lines = readfile('Xtest_mks.out')
427 let term_cmd = ''
428 for line in lines
429 if line =~ '^terminal'
430 call assert_report('session must not restore teminal')
431 endif
432 endfor
433
Bram Moolenaar7a39dd72019-06-23 00:50:15 +0200434 call StopShellInTerminal(bufnr('%'))
Bram Moolenaar4d8bac82018-03-09 21:33:34 +0100435 call delete('Xtest_mks.out')
436 set sessionoptions&
437endfunc
438
439func Test_mksession_terminal_restore_other()
Bram Moolenaar5a4c3082019-12-01 15:23:11 +0100440 CheckFeature quickfix
441
Bram Moolenaar4d8bac82018-03-09 21:33:34 +0100442 terminal
Bram Moolenaar7ee80f72019-09-08 20:55:06 +0200443 eval bufnr('%')->term_setrestore('other')
Bram Moolenaar4d8bac82018-03-09 21:33:34 +0100444 mksession! Xtest_mks.out
445 let lines = readfile('Xtest_mks.out')
446 let term_cmd = ''
447 for line in lines
448 if line =~ '^terminal'
449 let term_cmd = line
450 endif
451 endfor
Bram Moolenaaraa5df7e2019-02-03 14:53:10 +0100452 call assert_match('terminal ++curwin ++cols=\d\+ ++rows=\d\+.*other', term_cmd)
Bram Moolenaar4d8bac82018-03-09 21:33:34 +0100453
Bram Moolenaar7a39dd72019-06-23 00:50:15 +0200454 call StopShellInTerminal(bufnr('%'))
Bram Moolenaar4d8bac82018-03-09 21:33:34 +0100455 call delete('Xtest_mks.out')
456endfunc
457
458endif " has('terminal')
Bram Moolenaar4bebc9a2017-08-30 21:07:38 +0200459
Bram Moolenaar627cb6a2018-08-28 22:19:31 +0200460" Test :mkview with a file argument.
461func Test_mkview_file()
462 " Create a view with line number and a fold.
463 help :mkview
464 set number
Bram Moolenaar2bf4fe02018-08-30 14:04:25 +0200465 norm! V}zf0
Bram Moolenaardd5d18e2018-08-30 14:16:06 +0200466 let pos = getpos('.')
Bram Moolenaar627cb6a2018-08-28 22:19:31 +0200467 let linefoldclosed1 = foldclosed('.')
468 mkview! Xview
469 set nonumber
470 norm! zrj
471 " We can close the help window, as mkview with a file name should
472 " generate a command to edit the file.
473 helpclose
474
475 source Xview
476 call assert_equal(1, &number)
477 call assert_match('\*:mkview\*$', getline('.'))
Bram Moolenaardd5d18e2018-08-30 14:16:06 +0200478 call assert_equal(pos, getpos('.'))
Bram Moolenaar627cb6a2018-08-28 22:19:31 +0200479 call assert_equal(linefoldclosed1, foldclosed('.'))
480
481 " Creating a view again with the same file name should fail (file
482 " already exists). But with a !, the previous view should be
483 " overwritten without error.
484 help :loadview
485 call assert_fails('mkview Xview', 'E189:')
486 call assert_match('\*:loadview\*$', getline('.'))
487 mkview! Xview
488 call assert_match('\*:loadview\*$', getline('.'))
489
490 call delete('Xview')
491 bwipe
492endfunc
493
494" Test :mkview and :loadview with a custom 'viewdir'.
495func Test_mkview_loadview_with_viewdir()
496 set viewdir=Xviewdir
497
498 help :mkview
499 set number
500 norm! V}zf
Bram Moolenaardd5d18e2018-08-30 14:16:06 +0200501 let pos = getpos('.')
Bram Moolenaar627cb6a2018-08-28 22:19:31 +0200502 let linefoldclosed1 = foldclosed('.')
503 mkview 1
504 set nonumber
505 norm! zrj
506
507 loadview 1
508
509 " The directory Xviewdir/ should have been created and the view
510 " should be stored in that directory.
511 call assert_equal('Xviewdir/' .
512 \ substitute(
513 \ substitute(
514 \ expand('%:p'), '/', '=+', 'g'), ':', '=-', 'g') . '=1.vim',
515 \ glob('Xviewdir/*'))
516 call assert_equal(1, &number)
517 call assert_match('\*:mkview\*$', getline('.'))
Bram Moolenaardd5d18e2018-08-30 14:16:06 +0200518 call assert_equal(pos, getpos('.'))
Bram Moolenaar627cb6a2018-08-28 22:19:31 +0200519 call assert_equal(linefoldclosed1, foldclosed('.'))
520
521 call delete('Xviewdir', 'rf')
522 set viewdir&
523 helpclose
524endfunc
525
526func Test_mkview_no_file_name()
527 new
528 " :mkview or :mkview {nr} should fail in a unnamed buffer.
529 call assert_fails('mkview', 'E32:')
530 call assert_fails('mkview 1', 'E32:')
531
532 " :mkview {file} should succeed in a unnamed buffer.
533 mkview Xview
534 help
535 source Xview
536 call assert_equal('', bufname('%'))
537
538 call delete('Xview')
539 %bwipe
540endfunc
Bram Moolenaar79da5632017-02-01 22:52:44 +0100541
Bram Moolenaar555de4e2019-01-21 23:03:49 +0100542" A clean session (one empty buffer, one window, and one tab) should not
543" set any error messages when sourced because no commands should fail.
544func Test_mksession_no_errmsg()
545 let v:errmsg = ''
546 %bwipe!
547 mksession! Xtest_mks.out
548 source Xtest_mks.out
549 call assert_equal('', v:errmsg)
550 call delete('Xtest_mks.out')
551endfunc
552
Bram Moolenaarad36a352019-01-24 13:34:42 +0100553func Test_mksession_quote_in_filename()
Bram Moolenaar6d91bcb2020-08-12 18:50:36 +0200554 " only Unix can handle this weird filename
555 CheckUnix
556
Bram Moolenaarad36a352019-01-24 13:34:42 +0100557 let v:errmsg = ''
558 %bwipe!
559 split another
560 split x'y\"z
561 mksession! Xtest_mks_quoted.out
562 %bwipe!
563 source Xtest_mks_quoted.out
564 call assert_true(bufexists("x'y\"z"))
565
566 %bwipe!
567 call delete('Xtest_mks_quoted.out')
568endfunc
569
Bram Moolenaar66f0e6c2019-09-28 19:08:45 +0200570" Test for storing global variables in a session file
571func Test_mksession_globals()
572 set sessionoptions+=globals
573
574 " create different global variables
Bram Moolenaaree1a2b52019-09-29 14:23:39 +0200575 let g:Global_string = "Sun is shining\r\n"
Bram Moolenaar66f0e6c2019-09-28 19:08:45 +0200576 let g:Global_count = 100
577 let g:Global_pi = 3.14
Bram Moolenaaree1a2b52019-09-29 14:23:39 +0200578 let g:Global_neg_float = -2.68
Bram Moolenaar66f0e6c2019-09-28 19:08:45 +0200579
580 mksession! Xtest_mks.out
581
582 unlet g:Global_string
583 unlet g:Global_count
584 unlet g:Global_pi
Bram Moolenaaree1a2b52019-09-29 14:23:39 +0200585 unlet g:Global_neg_float
Bram Moolenaar66f0e6c2019-09-28 19:08:45 +0200586
587 source Xtest_mks.out
Bram Moolenaaree1a2b52019-09-29 14:23:39 +0200588 call assert_equal("Sun is shining\r\n", g:Global_string)
Bram Moolenaar66f0e6c2019-09-28 19:08:45 +0200589 call assert_equal(100, g:Global_count)
590 call assert_equal(3.14, g:Global_pi)
Bram Moolenaaree1a2b52019-09-29 14:23:39 +0200591 call assert_equal(-2.68, g:Global_neg_float)
Bram Moolenaar66f0e6c2019-09-28 19:08:45 +0200592
593 unlet g:Global_string
594 unlet g:Global_count
595 unlet g:Global_pi
Bram Moolenaaree1a2b52019-09-29 14:23:39 +0200596 unlet g:Global_neg_float
Bram Moolenaar66f0e6c2019-09-28 19:08:45 +0200597 call delete('Xtest_mks.out')
598 set sessionoptions&
599endfunc
600
601" Test for changing backslash to forward slash in filenames
602func Test_mksession_slash()
Bram Moolenaar37ac4a52019-09-28 19:29:04 +0200603 if exists('+shellslash')
604 throw 'Skipped: cannot use backslash in file name'
605 endif
Bram Moolenaar66f0e6c2019-09-28 19:08:45 +0200606 enew
607 %bwipe!
608 e a\\b\\c
609 mksession! Xtest_mks1.out
610 set sessionoptions+=slash
611 mksession! Xtest_mks2.out
612
613 %bwipe!
614 source Xtest_mks1.out
615 call assert_equal('a\b\c', bufname(''))
616 %bwipe!
617 source Xtest_mks2.out
618 call assert_equal('a/b/c', bufname(''))
619
620 %bwipe!
621 call delete('Xtest_mks1.out')
622 call delete('Xtest_mks2.out')
623 set sessionoptions&
624endfunc
625
Bram Moolenaar66f0e6c2019-09-28 19:08:45 +0200626" Test for changing directory to the session file directory
627func Test_mksession_sesdir()
Bram Moolenaar5bf46e92019-11-09 18:06:04 +0100628 let save_cwd = getcwd()
Bram Moolenaar66f0e6c2019-09-28 19:08:45 +0200629 call mkdir('Xproj')
630 mksession! Xproj/Xtest_mks1.out
631 set sessionoptions-=curdir
632 set sessionoptions+=sesdir
633 mksession! Xproj/Xtest_mks2.out
634
635 source Xproj/Xtest_mks1.out
636 call assert_equal('testdir', fnamemodify(getcwd(), ':t'))
637 source Xproj/Xtest_mks2.out
638 call assert_equal('Xproj', fnamemodify(getcwd(), ':t'))
Bram Moolenaar5bf46e92019-11-09 18:06:04 +0100639 call chdir(save_cwd)
640 %bwipe
Bram Moolenaar66f0e6c2019-09-28 19:08:45 +0200641
642 set sessionoptions&
643 call delete('Xproj', 'rf')
644endfunc
645
646" Test for storing the 'lines' and 'columns' settings
647func Test_mksession_resize()
648 mksession! Xtest_mks1.out
649 set sessionoptions+=resize
650 mksession! Xtest_mks2.out
651
652 let lines = readfile('Xtest_mks1.out')
653 let found_resize = v:false
654 for line in lines
655 if line =~ '^set lines='
656 let found_resize = v:true
Bram Moolenaaree1a2b52019-09-29 14:23:39 +0200657 break
Bram Moolenaar66f0e6c2019-09-28 19:08:45 +0200658 endif
659 endfor
Bram Moolenaaree1a2b52019-09-29 14:23:39 +0200660 call assert_false(found_resize)
Bram Moolenaar66f0e6c2019-09-28 19:08:45 +0200661 let lines = readfile('Xtest_mks2.out')
662 let found_resize = v:false
663 for line in lines
664 if line =~ '^set lines='
665 let found_resize = v:true
Bram Moolenaaree1a2b52019-09-29 14:23:39 +0200666 break
Bram Moolenaar66f0e6c2019-09-28 19:08:45 +0200667 endif
668 endfor
Bram Moolenaaree1a2b52019-09-29 14:23:39 +0200669 call assert_true(found_resize)
Bram Moolenaar66f0e6c2019-09-28 19:08:45 +0200670
671 call delete('Xtest_mks1.out')
672 call delete('Xtest_mks2.out')
673 set sessionoptions&
674endfunc
675
Bram Moolenaaree1a2b52019-09-29 14:23:39 +0200676" Test for mksession with a named scratch buffer
677func Test_mksession_scratch()
678 enew | only
679 file Xscratch
680 set buftype=nofile
681 mksession! Xtest_mks.out
682 %bwipe
683 source Xtest_mks.out
684 call assert_equal('Xscratch', bufname(''))
685 call assert_equal('nofile', &buftype)
686 %bwipe
687 call delete('Xtest_mks.out')
688endfunc
689
690" Test for mksession with fold options
691func Test_mksession_foldopt()
692 set sessionoptions-=options
693 set sessionoptions+=folds
694 new
695 setlocal foldenable
696 setlocal foldmethod=expr
697 setlocal foldmarker=<<<,>>>
698 setlocal foldignore=%
699 setlocal foldlevel=2
700 setlocal foldminlines=10
701 setlocal foldnestmax=15
702 mksession! Xtest_mks.out
703 close
704 %bwipe
705
706 source Xtest_mks.out
707 call assert_true(&foldenable)
708 call assert_equal('expr', &foldmethod)
709 call assert_equal('<<<,>>>', &foldmarker)
710 call assert_equal('%', &foldignore)
711 call assert_equal(2, &foldlevel)
712 call assert_equal(10, &foldminlines)
713 call assert_equal(15, &foldnestmax)
714
715 close
716 %bwipe
717 set sessionoptions&
718endfunc
719
720" Test for mksession with window position
721func Test_mksession_winpos()
Bram Moolenaar6d91bcb2020-08-12 18:50:36 +0200722 " Only applicable in GUI Vim
723 CheckGui
724
Bram Moolenaaree1a2b52019-09-29 14:23:39 +0200725 set sessionoptions+=winpos
726 mksession! Xtest_mks.out
727 let found_winpos = v:false
728 let lines = readfile('Xtest_mks.out')
729 for line in lines
730 if line =~ '^winpos '
731 let found_winpos = v:true
732 break
733 endif
734 endfor
735 call assert_true(found_winpos)
736 call delete('Xtest_mks.out')
737 set sessionoptions&
738endfunc
739
740" Test for mksession with 'compatible' option
741func Test_mksession_compatible()
742 mksession! Xtest_mks1.out
743 set compatible
744 mksession! Xtest_mks2.out
745 set nocp
746
747 let test_success = v:false
748 let lines = readfile('Xtest_mks1.out')
749 for line in lines
750 if line =~ '^if &cp | set nocp | endif'
751 let test_success = v:true
752 break
753 endif
754 endfor
755 call assert_true(test_success)
756
757 let test_success = v:false
758 let lines = readfile('Xtest_mks2.out')
759 for line in lines
760 if line =~ '^if !&cp | set cp | endif'
761 let test_success = v:true
762 break
763 endif
764 endfor
765 call assert_true(test_success)
766
767 call delete('Xtest_mks1.out')
768 call delete('Xtest_mks2.out')
769 set compatible&
770 set sessionoptions&
771endfunc
772
Bram Moolenaar87500262019-08-01 23:05:49 +0200773func s:ClearMappings()
774 mapclear
775 omapclear
776 mapclear!
777 lmapclear
778 tmapclear
779endfunc
780
781func Test_mkvimrc()
782 let entries = [
783 \ ['', 'nothing', '<Nop>'],
784 \ ['n', 'normal', 'NORMAL'],
785 \ ['v', 'visual', 'VISUAL'],
786 \ ['s', 'select', 'SELECT'],
787 \ ['x', 'visualonly', 'VISUALONLY'],
788 \ ['o', 'operator', 'OPERATOR'],
789 \ ['i', 'insert', 'INSERT'],
790 \ ['l', 'lang', 'LANG'],
791 \ ['c', 'command', 'COMMAND'],
792 \ ['t', 'terminal', 'TERMINAL'],
793 \ ]
794 for entry in entries
795 exe entry[0] .. 'map ' .. entry[1] .. ' ' .. entry[2]
796 endfor
797
798 mkvimrc Xtestvimrc
799
800 call s:ClearMappings()
801 for entry in entries
802 call assert_equal('', maparg(entry[1], entry[0]))
803 endfor
804
805 source Xtestvimrc
806
807 for entry in entries
808 call assert_equal(entry[2], maparg(entry[1], entry[0]))
809 endfor
810
811 call s:ClearMappings()
812 call delete('Xtestvimrc')
813endfunc
814
Bram Moolenaareca626f2016-12-01 18:47:38 +0100815" vim: shiftwidth=2 sts=2 expandtab