1eca626fcSBram Moolenaar" Test for :mksession, :mkview and :loadview in latin1 encoding
2eca626fcSBram Moolenaar
3eca626fcSBram Moolenaarset encoding=latin1
4eca626fcSBram Moolenaarscriptencoding latin1
5eca626fcSBram Moolenaar
6b46fecd3SBram Moolenaarsource check.vim
7b46fecd3SBram MoolenaarCheckFeature mksession
8eca626fcSBram Moolenaar
94d8bac8bSBram Moolenaarsource shared.vim
107a39dd7fSBram Moolenaarsource term_util.vim
114d8bac8bSBram Moolenaar
121e15e611SBram Moolenaar" Test for storing global and local argument list in a session file
131e15e611SBram Moolenaar" This one must be done first.
141e15e611SBram Moolenaarfunc Test__mksession_arglocal()
151e15e611SBram Moolenaar  enew | only
161e15e611SBram Moolenaar  n a b c
171e15e611SBram Moolenaar  new
181e15e611SBram Moolenaar  arglocal
191e15e611SBram Moolenaar  mksession! Xtest_mks.out
201e15e611SBram Moolenaar
211e15e611SBram Moolenaar  %bwipe!
221e15e611SBram Moolenaar  %argdelete
231e15e611SBram Moolenaar  argglobal
241e15e611SBram Moolenaar  source Xtest_mks.out
251e15e611SBram Moolenaar  call assert_equal(2, winnr('$'))
261e15e611SBram Moolenaar  call assert_equal(2, arglistid(1))
271e15e611SBram Moolenaar  call assert_equal(0, arglistid(2))
281e15e611SBram Moolenaar
291e15e611SBram Moolenaar  %bwipe!
301e15e611SBram Moolenaar  %argdelete
311e15e611SBram Moolenaar  argglobal
321e15e611SBram Moolenaar  call delete('Xtest_mks.out')
331e15e611SBram Moolenaarendfunc
341e15e611SBram Moolenaar
35eca626fcSBram Moolenaarfunc Test_mksession()
36eca626fcSBram Moolenaar  tabnew
37eca626fcSBram Moolenaar  let wrap_save = &wrap
38eca626fcSBram Moolenaar  set sessionoptions=buffers splitbelow fileencoding=latin1
39eca626fcSBram Moolenaar  call setline(1, [
40eca626fcSBram Moolenaar    \   'start:',
41eca626fcSBram Moolenaar    \   'no multibyte chAracter',
42eca626fcSBram Moolenaar    \   '	one leaDing tab',
43eca626fcSBram Moolenaar    \   '    four leadinG spaces',
44eca626fcSBram Moolenaar    \   'two		consecutive tabs',
45eca626fcSBram Moolenaar    \   'two	tabs	in one line',
46eca626fcSBram Moolenaar    \   'one � multibyteCharacter',
47eca626fcSBram Moolenaar    \   'a� �  two multiByte characters',
4892c1b696SBram Moolenaar    \   'A���  three mulTibyte characters',
4992c1b696SBram Moolenaar    \   'short line',
50eca626fcSBram Moolenaar    \ ])
51c9b56b2cSBram Moolenaar  let tmpfile = 'Xtemp'
52eca626fcSBram Moolenaar  exec 'w! ' . tmpfile
53eca626fcSBram Moolenaar  /^start:
54eca626fcSBram Moolenaar  set wrap
55eca626fcSBram Moolenaar  vsplit
56eca626fcSBram Moolenaar  norm! j16|
57eca626fcSBram Moolenaar  split
58eca626fcSBram Moolenaar  norm! j16|
59eca626fcSBram Moolenaar  split
60eca626fcSBram Moolenaar  norm! j16|
61eca626fcSBram Moolenaar  split
62eca626fcSBram Moolenaar  norm! j8|
63eca626fcSBram Moolenaar  split
64eca626fcSBram Moolenaar  norm! j8|
65eca626fcSBram Moolenaar  split
66eca626fcSBram Moolenaar  norm! j16|
67eca626fcSBram Moolenaar  split
68eca626fcSBram Moolenaar  norm! j16|
69eca626fcSBram Moolenaar  split
70eca626fcSBram Moolenaar  norm! j16|
7192c1b696SBram Moolenaar  split
7292c1b696SBram Moolenaar  norm! j$
73eca626fcSBram Moolenaar  wincmd l
74eca626fcSBram Moolenaar
75eca626fcSBram Moolenaar  set nowrap
76eca626fcSBram Moolenaar  /^start:
77eca626fcSBram Moolenaar  norm! j16|3zl
78eca626fcSBram Moolenaar  split
79eca626fcSBram Moolenaar  norm! j016|3zl
80eca626fcSBram Moolenaar  split
81eca626fcSBram Moolenaar  norm! j016|3zl
82eca626fcSBram Moolenaar  split
83eca626fcSBram Moolenaar  norm! j08|3zl
84eca626fcSBram Moolenaar  split
85eca626fcSBram Moolenaar  norm! j08|3zl
86eca626fcSBram Moolenaar  split
87eca626fcSBram Moolenaar  norm! j016|3zl
88eca626fcSBram Moolenaar  split
89eca626fcSBram Moolenaar  norm! j016|3zl
90eca626fcSBram Moolenaar  split
91eca626fcSBram Moolenaar  norm! j016|3zl
92eca626fcSBram Moolenaar  split
93eca626fcSBram Moolenaar  call wincol()
94c9b56b2cSBram Moolenaar  mksession! Xtest_mks.out
9592c1b696SBram Moolenaar  let li = filter(readfile('Xtest_mks.out'), 'v:val =~# "\\(^ *normal! [0$]\\|^ *exe ''normal!\\)"')
96eca626fcSBram Moolenaar  let expected = [
97eca626fcSBram Moolenaar    \   'normal! 016|',
98eca626fcSBram Moolenaar    \   'normal! 016|',
99eca626fcSBram Moolenaar    \   'normal! 016|',
100eca626fcSBram Moolenaar    \   'normal! 08|',
101eca626fcSBram Moolenaar    \   'normal! 08|',
102eca626fcSBram Moolenaar    \   'normal! 016|',
103eca626fcSBram Moolenaar    \   'normal! 016|',
104eca626fcSBram Moolenaar    \   'normal! 016|',
10592c1b696SBram Moolenaar    \   'normal! $',
106eca626fcSBram Moolenaar    \   "  exe 'normal! ' . s:c . '|zs' . 16 . '|'",
107eca626fcSBram Moolenaar    \   "  normal! 016|",
108eca626fcSBram Moolenaar    \   "  exe 'normal! ' . s:c . '|zs' . 16 . '|'",
109eca626fcSBram Moolenaar    \   "  normal! 016|",
110eca626fcSBram Moolenaar    \   "  exe 'normal! ' . s:c . '|zs' . 16 . '|'",
111eca626fcSBram Moolenaar    \   "  normal! 016|",
112eca626fcSBram Moolenaar    \   "  exe 'normal! ' . s:c . '|zs' . 8 . '|'",
113eca626fcSBram Moolenaar    \   "  normal! 08|",
114eca626fcSBram Moolenaar    \   "  exe 'normal! ' . s:c . '|zs' . 8 . '|'",
115eca626fcSBram Moolenaar    \   "  normal! 08|",
116eca626fcSBram Moolenaar    \   "  exe 'normal! ' . s:c . '|zs' . 16 . '|'",
117eca626fcSBram Moolenaar    \   "  normal! 016|",
118eca626fcSBram Moolenaar    \   "  exe 'normal! ' . s:c . '|zs' . 16 . '|'",
119eca626fcSBram Moolenaar    \   "  normal! 016|",
120eca626fcSBram Moolenaar    \   "  exe 'normal! ' . s:c . '|zs' . 16 . '|'",
121eca626fcSBram Moolenaar    \   "  normal! 016|",
122eca626fcSBram Moolenaar    \   "  exe 'normal! ' . s:c . '|zs' . 16 . '|'",
123eca626fcSBram Moolenaar    \   "  normal! 016|"
124eca626fcSBram Moolenaar    \ ]
125eca626fcSBram Moolenaar  call assert_equal(expected, li)
126eca626fcSBram Moolenaar  tabclose!
127eca626fcSBram Moolenaar
128c9b56b2cSBram Moolenaar  call delete('Xtest_mks.out')
129eca626fcSBram Moolenaar  call delete(tmpfile)
130eca626fcSBram Moolenaar  let &wrap = wrap_save
1314d8bac8bSBram Moolenaar  set sessionoptions&
132eca626fcSBram Moolenaarendfunc
133eca626fcSBram Moolenaar
134635bd608SBram Moolenaardef Test_mksession_skiprtp()
135635bd608SBram Moolenaar  mksession! Xtest_mks.out
136d23b714dSBram Moolenaar  var found_rtp = 0
137d23b714dSBram Moolenaar  var found_pp = 0
138635bd608SBram Moolenaar  for line in readfile('Xtest_mks.out')
139635bd608SBram Moolenaar    if line =~ 'set runtimepath'
140d23b714dSBram Moolenaar      found_rtp += 1
141d23b714dSBram Moolenaar    endif
142d23b714dSBram Moolenaar    if line =~ 'set packpath'
143d23b714dSBram Moolenaar      found_pp += 1
144635bd608SBram Moolenaar    endif
145635bd608SBram Moolenaar  endfor
146d23b714dSBram Moolenaar  assert_equal(1, found_rtp)
147d23b714dSBram Moolenaar  assert_equal(1, found_pp)
148635bd608SBram Moolenaar  delete('Xtest_mks.out')
149635bd608SBram Moolenaar
150635bd608SBram Moolenaar  set sessionoptions+=skiprtp
151635bd608SBram Moolenaar  mksession! Xtest_mks.out
152d23b714dSBram Moolenaar  var found = 0
153635bd608SBram Moolenaar  for line in readfile('Xtest_mks.out')
154d23b714dSBram Moolenaar    if line =~ 'set \(runtimepath\|packpath\)'
155635bd608SBram Moolenaar      found = 1
156635bd608SBram Moolenaar      break
157635bd608SBram Moolenaar    endif
158635bd608SBram Moolenaar  endfor
159635bd608SBram Moolenaar  assert_equal(0, found)
160635bd608SBram Moolenaar  delete('Xtest_mks.out')
161635bd608SBram Moolenaar  set sessionoptions&
162635bd608SBram Moolenaarenddef
163635bd608SBram Moolenaar
16436ae89c5SBram Moolenaarfunc Test_mksession_winheight()
16536ae89c5SBram Moolenaar  new
1661c3c1049SBram Moolenaar  set winheight=10
1671c3c1049SBram Moolenaar  set winminheight=2
168c9b56b2cSBram Moolenaar  mksession! Xtest_mks.out
169c9b56b2cSBram Moolenaar  source Xtest_mks.out
17036ae89c5SBram Moolenaar
171c9b56b2cSBram Moolenaar  call delete('Xtest_mks.out')
17236ae89c5SBram Moolenaarendfunc
17336ae89c5SBram Moolenaar
1741c3c1049SBram Moolenaarfunc Test_mksession_large_winheight()
1751c3c1049SBram Moolenaar  set winheight=999
1761c3c1049SBram Moolenaar  mksession! Xtest_mks_winheight.out
1771c3c1049SBram Moolenaar  set winheight&
1781c3c1049SBram Moolenaar  source Xtest_mks_winheight.out
1791c3c1049SBram Moolenaar  call delete('Xtest_mks_winheight.out')
1801c3c1049SBram Moolenaarendfunc
1811c3c1049SBram Moolenaar
182b6c2e9a0SBram Moolenaarfunc Test_mksession_zero_winheight()
183b6c2e9a0SBram Moolenaar  set winminheight=0
184b6c2e9a0SBram Moolenaar  edit SomeFile
185b6c2e9a0SBram Moolenaar  split
186b6c2e9a0SBram Moolenaar  wincmd _
187b6c2e9a0SBram Moolenaar  mksession! Xtest_mks_zero
188b6c2e9a0SBram Moolenaar  set winminheight&
189b6c2e9a0SBram Moolenaar  let text = readfile('Xtest_mks_zero')->join()
1905f8ed740SDominique Pelle  call delete('Xtest_mks_zero')
191b6c2e9a0SBram Moolenaar  close
1925f8ed740SDominique Pelle  " check there is no divide by zero
193b6c2e9a0SBram Moolenaar  call assert_notmatch('/ 0[^0-9]', text)
194b6c2e9a0SBram Moolenaarendfunc
195b6c2e9a0SBram Moolenaar
196ed18f2c0SBram Moolenaarfunc Test_mksession_rtp()
1976d91bcb4SBram Moolenaar  " TODO: fix problem with backslashes on Win32
1986d91bcb4SBram Moolenaar  CheckNotMSWindows
1996d91bcb4SBram Moolenaar
200ed18f2c0SBram Moolenaar  new
201ed18f2c0SBram Moolenaar  let _rtp=&rtp
202ed18f2c0SBram Moolenaar  " Make a real long (invalid) runtimepath value,
203ed18f2c0SBram Moolenaar  " that should exceed PATH_MAX (hopefully)
204ed18f2c0SBram Moolenaar  let newrtp=&rtp.',~'.repeat('/foobar', 1000)
205ed18f2c0SBram Moolenaar  let newrtp.=",".expand("$HOME")."/.vim"
206ed18f2c0SBram Moolenaar  let &rtp=newrtp
207ed18f2c0SBram Moolenaar
208ed18f2c0SBram Moolenaar  " determine expected value
209ed18f2c0SBram Moolenaar  let expected=split(&rtp, ',')
210ed18f2c0SBram Moolenaar  let expected = map(expected, '"set runtimepath+=".v:val')
211ed18f2c0SBram Moolenaar  let expected = ['set runtimepath='] + expected
212ed18f2c0SBram Moolenaar  let expected = map(expected, {v,w -> substitute(w, $HOME, "~", "g")})
213ed18f2c0SBram Moolenaar
214ed18f2c0SBram Moolenaar  mksession! Xtest_mks.out
215ed18f2c0SBram Moolenaar  let &rtp=_rtp
216ed18f2c0SBram Moolenaar  let li = filter(readfile('Xtest_mks.out'), 'v:val =~# "runtimepath"')
217ed18f2c0SBram Moolenaar  call assert_equal(expected, li)
218ed18f2c0SBram Moolenaar
219ed18f2c0SBram Moolenaar  call delete('Xtest_mks.out')
220ed18f2c0SBram Moolenaarendfunc
221ed18f2c0SBram Moolenaar
22279da563cSBram Moolenaarfunc Test_mksession_arglist()
22366f0e6c6SBram Moolenaar  %argdel
22479da563cSBram Moolenaar  next file1 file2 file3 file4
225ee1a2b5aSBram Moolenaar  new
226ee1a2b5aSBram Moolenaar  next | next
22779da563cSBram Moolenaar  mksession! Xtest_mks.out
22879da563cSBram Moolenaar  source Xtest_mks.out
22979da563cSBram Moolenaar  call assert_equal(['file1', 'file2', 'file3', 'file4'], argv())
230ee1a2b5aSBram Moolenaar  call assert_equal(2, argidx())
231ee1a2b5aSBram Moolenaar  wincmd w
232ee1a2b5aSBram Moolenaar  call assert_equal(0, argidx())
23379da563cSBram Moolenaar
23479da563cSBram Moolenaar  call delete('Xtest_mks.out')
235ee1a2b5aSBram Moolenaar  enew | only
23679da563cSBram Moolenaar  argdel *
23779da563cSBram Moolenaarendfunc
23879da563cSBram Moolenaar
2394bebc9a0SBram Moolenaarfunc Test_mksession_one_buffer_two_windows()
2404bebc9a0SBram Moolenaar  edit Xtest1
2414bebc9a0SBram Moolenaar  new Xtest2
2424bebc9a0SBram Moolenaar  split
2434bebc9a0SBram Moolenaar  mksession! Xtest_mks.out
2444bebc9a0SBram Moolenaar  let lines = readfile('Xtest_mks.out')
2454bebc9a0SBram Moolenaar  let count1 = 0
2464bebc9a0SBram Moolenaar  let count2 = 0
2474bebc9a0SBram Moolenaar  let count2buf = 0
2484bebc9a0SBram Moolenaar  for line in lines
2494bebc9a0SBram Moolenaar    if line =~ 'edit \f*Xtest1$'
2504bebc9a0SBram Moolenaar      let count1 += 1
2514bebc9a0SBram Moolenaar    endif
2524bebc9a0SBram Moolenaar    if line =~ 'edit \f\{-}Xtest2'
2534bebc9a0SBram Moolenaar      let count2 += 1
2544bebc9a0SBram Moolenaar    endif
2554bebc9a0SBram Moolenaar    if line =~ 'buffer \f\{-}Xtest2'
2564bebc9a0SBram Moolenaar      let count2buf += 1
2574bebc9a0SBram Moolenaar    endif
2584bebc9a0SBram Moolenaar  endfor
2594bebc9a0SBram Moolenaar  call assert_equal(1, count1, 'Xtest1 count')
2604bebc9a0SBram Moolenaar  call assert_equal(2, count2, 'Xtest2 count')
2614bebc9a0SBram Moolenaar  call assert_equal(2, count2buf, 'Xtest2 buffer count')
2624bebc9a0SBram Moolenaar
2634bebc9a0SBram Moolenaar  close
2644bebc9a0SBram Moolenaar  bwipe!
2654bebc9a0SBram Moolenaar  call delete('Xtest_mks.out')
2664bebc9a0SBram Moolenaarendfunc
2674bebc9a0SBram Moolenaar
26826d4b896SBram Moolenaarfunc Test_mksession_lcd_multiple_tabs()
26926d4b896SBram Moolenaar  tabnew
27026d4b896SBram Moolenaar  tabnew
27181e2ac7bSBram Moolenaar  lcd .
27226d4b896SBram Moolenaar  tabfirst
27381e2ac7bSBram Moolenaar  lcd .
27426d4b896SBram Moolenaar  mksession! Xtest_mks.out
27526d4b896SBram Moolenaar  tabonly
27626d4b896SBram Moolenaar  source Xtest_mks.out
27726d4b896SBram Moolenaar  call assert_true(haslocaldir(), 'Tab 1 localdir')
27826d4b896SBram Moolenaar  tabnext 2
27926d4b896SBram Moolenaar  call assert_true(!haslocaldir(), 'Tab 2 localdir')
28026d4b896SBram Moolenaar  tabnext 3
28126d4b896SBram Moolenaar  call assert_true(haslocaldir(), 'Tab 3 localdir')
28226d4b896SBram Moolenaar  call delete('Xtest_mks.out')
28326d4b896SBram Moolenaarendfunc
28426d4b896SBram Moolenaar
28500aa069dSBram Moolenaar" Test for tabpage-local directory
28600aa069dSBram Moolenaarfunc Test_mksession_tcd_multiple_tabs()
28700aa069dSBram Moolenaar  let save_cwd = getcwd()
28800aa069dSBram Moolenaar  call mkdir('Xtopdir')
28900aa069dSBram Moolenaar  cd Xtopdir
29000aa069dSBram Moolenaar  call mkdir('Xtabdir1')
29100aa069dSBram Moolenaar  call mkdir('Xtabdir2')
29200aa069dSBram Moolenaar  call mkdir('Xtabdir3')
29300aa069dSBram Moolenaar  call mkdir('Xwindir1')
29400aa069dSBram Moolenaar  call mkdir('Xwindir2')
29500aa069dSBram Moolenaar  call mkdir('Xwindir3')
29600aa069dSBram Moolenaar  tcd Xtabdir1
29700aa069dSBram Moolenaar  botright new
29800aa069dSBram Moolenaar  wincmd t
29900aa069dSBram Moolenaar  lcd ../Xwindir1
30000aa069dSBram Moolenaar  tabnew
30100aa069dSBram Moolenaar  tcd ../Xtabdir2
30200aa069dSBram Moolenaar  botright new
30300aa069dSBram Moolenaar  lcd ../Xwindir2
30400aa069dSBram Moolenaar  tabnew
30500aa069dSBram Moolenaar  tcd ../Xtabdir3
30600aa069dSBram Moolenaar  botright new
30700aa069dSBram Moolenaar  lcd ../Xwindir3
30800aa069dSBram Moolenaar  tabfirst
30900aa069dSBram Moolenaar  1wincmd w
31000aa069dSBram Moolenaar  mksession! Xtest_mks.out
31100aa069dSBram Moolenaar  only | tabonly
31200aa069dSBram Moolenaar  source Xtest_mks.out
31300aa069dSBram Moolenaar  call assert_equal('Xtabdir1', fnamemodify(getcwd(-1, 1), ':t'))
31400aa069dSBram Moolenaar  call assert_equal('Xwindir1', fnamemodify(getcwd(1, 1), ':t'))
31500aa069dSBram Moolenaar  call assert_equal('Xtabdir1', fnamemodify(getcwd(2, 1), ':t'))
31600aa069dSBram Moolenaar  call assert_equal('Xtabdir2', fnamemodify(getcwd(-1, 2), ':t'))
31700aa069dSBram Moolenaar  call assert_equal('Xtabdir2', fnamemodify(getcwd(1, 2), ':t'))
31800aa069dSBram Moolenaar  call assert_equal('Xwindir2', fnamemodify(getcwd(2, 2), ':t'))
31900aa069dSBram Moolenaar  call assert_equal('Xtabdir3', fnamemodify(getcwd(-1, 3), ':t'))
32000aa069dSBram Moolenaar  call assert_equal('Xtabdir3', fnamemodify(getcwd(1, 3), ':t'))
32100aa069dSBram Moolenaar  call assert_equal('Xwindir3', fnamemodify(getcwd(2, 3), ':t'))
3225bf46e97SBram Moolenaar  %bwipe
3235bf46e97SBram Moolenaar  call chdir(save_cwd)
32400aa069dSBram Moolenaar  call delete("Xtopdir", "rf")
32500aa069dSBram Moolenaarendfunc
32600aa069dSBram Moolenaar
32726d4b896SBram Moolenaarfunc Test_mksession_blank_tabs()
32826d4b896SBram Moolenaar  tabnew
32926d4b896SBram Moolenaar  tabnew
33026d4b896SBram Moolenaar  tabnew
33126d4b896SBram Moolenaar  tabnext 3
33226d4b896SBram Moolenaar  mksession! Xtest_mks.out
33326d4b896SBram Moolenaar  tabnew
33426d4b896SBram Moolenaar  tabnew
33526d4b896SBram Moolenaar  tabnext 2
33626d4b896SBram Moolenaar  source Xtest_mks.out
33726d4b896SBram Moolenaar  call assert_equal(4, tabpagenr('$'), 'session restore should restore number of tabs')
33826d4b896SBram Moolenaar  call assert_equal(3, tabpagenr(), 'session restore should restore the active tab')
33926d4b896SBram Moolenaar  call delete('Xtest_mks.out')
34026d4b896SBram Moolenaarendfunc
34126d4b896SBram Moolenaar
342d39e275bSBram Moolenaarfunc Test_mksession_buffer_count()
343d39e275bSBram Moolenaar  set hidden
344d39e275bSBram Moolenaar
345d39e275bSBram Moolenaar  " Edit exactly three files in the current session.
346d39e275bSBram Moolenaar  %bwipe!
347d39e275bSBram Moolenaar  e Xfoo | tabe Xbar | tabe Xbaz
348d39e275bSBram Moolenaar  tabdo write
349d39e275bSBram Moolenaar  mksession! Xtest_mks.out
350d39e275bSBram Moolenaar
351d39e275bSBram Moolenaar  " Verify that loading the session does not create additional buffers.
352d39e275bSBram Moolenaar  %bwipe!
353d39e275bSBram Moolenaar  source Xtest_mks.out
354d39e275bSBram Moolenaar  call assert_equal(3, len(getbufinfo()))
355d39e275bSBram Moolenaar
356d39e275bSBram Moolenaar  " Clean up.
357d39e275bSBram Moolenaar  call delete('Xfoo')
358d39e275bSBram Moolenaar  call delete('Xbar')
359d39e275bSBram Moolenaar  call delete('Xbaz')
360d39e275bSBram Moolenaar  call delete('Xtest_mks.out')
361d39e275bSBram Moolenaar  %bwipe!
362d39e275bSBram Moolenaar  set hidden&
363d39e275bSBram Moolenaarendfunc
364d39e275bSBram Moolenaar
365e3c74d24SBram Moolenaarif has('extra_search')
366e3c74d24SBram Moolenaar
367e3c74d24SBram Moolenaarfunc Test_mksession_hlsearch()
368e3c74d24SBram Moolenaar  set hlsearch
369e3c74d24SBram Moolenaar  mksession! Xtest_mks.out
370e3c74d24SBram Moolenaar  nohlsearch
371e3c74d24SBram Moolenaar  source Xtest_mks.out
372e3c74d24SBram Moolenaar  call assert_equal(1, v:hlsearch, 'session should restore search highlighting state')
373e3c74d24SBram Moolenaar  nohlsearch
374e3c74d24SBram Moolenaar  mksession! Xtest_mks.out
375e3c74d24SBram Moolenaar  source Xtest_mks.out
376e3c74d24SBram Moolenaar  call assert_equal(0, v:hlsearch, 'session should restore search highlighting state')
377e3c74d24SBram Moolenaar  call delete('Xtest_mks.out')
378e3c74d24SBram Moolenaarendfunc
379e3c74d24SBram Moolenaar
380e3c74d24SBram Moolenaarendif
381e3c74d24SBram Moolenaar
382e3c74d24SBram Moolenaar
38326d4b896SBram Moolenaarfunc Test_mksession_blank_windows()
38426d4b896SBram Moolenaar  split
38526d4b896SBram Moolenaar  split
38626d4b896SBram Moolenaar  split
38726d4b896SBram Moolenaar  3 wincmd w
38826d4b896SBram Moolenaar  mksession! Xtest_mks.out
38926d4b896SBram Moolenaar  split
39026d4b896SBram Moolenaar  split
39126d4b896SBram Moolenaar  2 wincmd w
39226d4b896SBram Moolenaar  source Xtest_mks.out
39326d4b896SBram Moolenaar  call assert_equal(4, winnr('$'), 'session restore should restore number of windows')
39426d4b896SBram Moolenaar  call assert_equal(3, winnr(), 'session restore should restore the active window')
39526d4b896SBram Moolenaar  call delete('Xtest_mks.out')
39626d4b896SBram Moolenaarendfunc
39726d4b896SBram Moolenaar
3984d8bac8bSBram Moolenaarfunc Test_mksession_terminal_shell()
399c2c82056SBram Moolenaar  CheckFeature terminal
4005a4c3082SBram Moolenaar  CheckFeature quickfix
4015a4c3082SBram Moolenaar
4024d8bac8bSBram Moolenaar  terminal
4034d8bac8bSBram Moolenaar  mksession! Xtest_mks.out
4044d8bac8bSBram Moolenaar  let lines = readfile('Xtest_mks.out')
4054d8bac8bSBram Moolenaar  let term_cmd = ''
4064d8bac8bSBram Moolenaar  for line in lines
4074d8bac8bSBram Moolenaar    if line =~ '^terminal'
4084d8bac8bSBram Moolenaar      let term_cmd = line
4094d8bac8bSBram Moolenaar    elseif line =~ 'badd.*' . &shell
4104d8bac8bSBram Moolenaar      call assert_report('unexpected shell line: ' . line)
4114d8bac8bSBram Moolenaar    endif
4124d8bac8bSBram Moolenaar  endfor
413aa5df7e3SBram Moolenaar  call assert_match('terminal ++curwin ++cols=\d\+ ++rows=\d\+\s*.*$', term_cmd)
4144d8bac8bSBram Moolenaar
4157a39dd7fSBram Moolenaar  call StopShellInTerminal(bufnr('%'))
4164d8bac8bSBram Moolenaar  call delete('Xtest_mks.out')
4174d8bac8bSBram Moolenaarendfunc
4184d8bac8bSBram Moolenaar
4194d8bac8bSBram Moolenaarfunc Test_mksession_terminal_no_restore_cmdarg()
420c2c82056SBram Moolenaar  CheckFeature terminal
421c2c82056SBram Moolenaar
4224d8bac8bSBram Moolenaar  terminal ++norestore
4234d8bac8bSBram Moolenaar  mksession! Xtest_mks.out
4244d8bac8bSBram Moolenaar  let lines = readfile('Xtest_mks.out')
4254d8bac8bSBram Moolenaar  let term_cmd = ''
4264d8bac8bSBram Moolenaar  for line in lines
4274d8bac8bSBram Moolenaar    if line =~ '^terminal'
428ac665c24SBram Moolenaar      call assert_report('session must not restore terminal')
4294d8bac8bSBram Moolenaar    endif
4304d8bac8bSBram Moolenaar  endfor
4314d8bac8bSBram Moolenaar
4327a39dd7fSBram Moolenaar  call StopShellInTerminal(bufnr('%'))
4334d8bac8bSBram Moolenaar  call delete('Xtest_mks.out')
4344d8bac8bSBram Moolenaarendfunc
4354d8bac8bSBram Moolenaar
4364d8bac8bSBram Moolenaarfunc Test_mksession_terminal_no_restore_funcarg()
437c2c82056SBram Moolenaar  CheckFeature terminal
438c2c82056SBram Moolenaar
4393a6aadb3SBram Moolenaar  let buf = Run_shell_in_terminal({'norestore': 1})
4404d8bac8bSBram Moolenaar  mksession! Xtest_mks.out
4414d8bac8bSBram Moolenaar  let lines = readfile('Xtest_mks.out')
4424d8bac8bSBram Moolenaar  let term_cmd = ''
4434d8bac8bSBram Moolenaar  for line in lines
4444d8bac8bSBram Moolenaar    if line =~ '^terminal'
445ac665c24SBram Moolenaar      call assert_report('session must not restore terminal')
4464d8bac8bSBram Moolenaar    endif
4474d8bac8bSBram Moolenaar  endfor
4484d8bac8bSBram Moolenaar
4493a6aadb3SBram Moolenaar  call StopShellInTerminal(buf)
4504d8bac8bSBram Moolenaar  call delete('Xtest_mks.out')
4514d8bac8bSBram Moolenaarendfunc
4524d8bac8bSBram Moolenaar
4534d8bac8bSBram Moolenaarfunc Test_mksession_terminal_no_restore_func()
454c2c82056SBram Moolenaar  CheckFeature terminal
455c2c82056SBram Moolenaar
4564d8bac8bSBram Moolenaar  terminal
4574d8bac8bSBram Moolenaar  call term_setrestore(bufnr('%'), 'NONE')
4584d8bac8bSBram Moolenaar  mksession! Xtest_mks.out
4594d8bac8bSBram Moolenaar  let lines = readfile('Xtest_mks.out')
4604d8bac8bSBram Moolenaar  let term_cmd = ''
4614d8bac8bSBram Moolenaar  for line in lines
4624d8bac8bSBram Moolenaar    if line =~ '^terminal'
463ac665c24SBram Moolenaar      call assert_report('session must not restore terminal')
4644d8bac8bSBram Moolenaar    endif
4654d8bac8bSBram Moolenaar  endfor
4664d8bac8bSBram Moolenaar
4677a39dd7fSBram Moolenaar  call StopShellInTerminal(bufnr('%'))
4684d8bac8bSBram Moolenaar  call delete('Xtest_mks.out')
4694d8bac8bSBram Moolenaarendfunc
4704d8bac8bSBram Moolenaar
4714d8bac8bSBram Moolenaarfunc Test_mksession_terminal_no_ssop()
472c2c82056SBram Moolenaar  CheckFeature terminal
473c2c82056SBram Moolenaar
4744d8bac8bSBram Moolenaar  terminal
4754d8bac8bSBram Moolenaar  set sessionoptions-=terminal
4764d8bac8bSBram Moolenaar  mksession! Xtest_mks.out
4774d8bac8bSBram Moolenaar  let lines = readfile('Xtest_mks.out')
4784d8bac8bSBram Moolenaar  let term_cmd = ''
4794d8bac8bSBram Moolenaar  for line in lines
4804d8bac8bSBram Moolenaar    if line =~ '^terminal'
481ac665c24SBram Moolenaar      call assert_report('session must not restore terminal')
4824d8bac8bSBram Moolenaar    endif
4834d8bac8bSBram Moolenaar  endfor
4844d8bac8bSBram Moolenaar
4857a39dd7fSBram Moolenaar  call StopShellInTerminal(bufnr('%'))
4864d8bac8bSBram Moolenaar  call delete('Xtest_mks.out')
4874d8bac8bSBram Moolenaar  set sessionoptions&
4884d8bac8bSBram Moolenaarendfunc
4894d8bac8bSBram Moolenaar
4904d8bac8bSBram Moolenaarfunc Test_mksession_terminal_restore_other()
491c2c82056SBram Moolenaar  CheckFeature terminal
4925a4c3082SBram Moolenaar  CheckFeature quickfix
4935a4c3082SBram Moolenaar
4944d8bac8bSBram Moolenaar  terminal
4957ee80f76SBram Moolenaar  eval bufnr('%')->term_setrestore('other')
4964d8bac8bSBram Moolenaar  mksession! Xtest_mks.out
4974d8bac8bSBram Moolenaar  let lines = readfile('Xtest_mks.out')
4984d8bac8bSBram Moolenaar  let term_cmd = ''
4994d8bac8bSBram Moolenaar  for line in lines
5004d8bac8bSBram Moolenaar    if line =~ '^terminal'
5014d8bac8bSBram Moolenaar      let term_cmd = line
5024d8bac8bSBram Moolenaar    endif
5034d8bac8bSBram Moolenaar  endfor
504aa5df7e3SBram Moolenaar  call assert_match('terminal ++curwin ++cols=\d\+ ++rows=\d\+.*other', term_cmd)
5054d8bac8bSBram Moolenaar
5067a39dd7fSBram Moolenaar  call StopShellInTerminal(bufnr('%'))
5074d8bac8bSBram Moolenaar  call delete('Xtest_mks.out')
5084d8bac8bSBram Moolenaarendfunc
5094d8bac8bSBram Moolenaar
5100e655111SBram Moolenaarfunc Test_mksession_terminal_shared_windows()
511c2c82056SBram Moolenaar  CheckFeature terminal
512c2c82056SBram Moolenaar
5130e655111SBram Moolenaar  terminal
5140e655111SBram Moolenaar  let term_buf = bufnr()
5150e655111SBram Moolenaar  new
5160e655111SBram Moolenaar  execute "buffer" term_buf
5170e655111SBram Moolenaar  mksession! Xtest_mks.out
5180e655111SBram Moolenaar
5190e655111SBram Moolenaar  let lines = readfile('Xtest_mks.out')
5200e655111SBram Moolenaar  let found_creation = 0
5210e655111SBram Moolenaar  let found_use = 0
5220e655111SBram Moolenaar
5230e655111SBram Moolenaar  for line in lines
5240e655111SBram Moolenaar    if line =~ '^terminal'
5250e655111SBram Moolenaar      let found_creation = 1
5260e655111SBram Moolenaar      call assert_match('terminal ++curwin ++cols=\d\+ ++rows=\d\+', line)
5270e655111SBram Moolenaar    elseif line =~ "^execute 'buffer ' . s:term_buf_" . term_buf . "$"
5280e655111SBram Moolenaar      let found_use = 1
5290e655111SBram Moolenaar    endif
5300e655111SBram Moolenaar  endfor
5310e655111SBram Moolenaar
5320e655111SBram Moolenaar  call assert_true(found_creation && found_use)
5330e655111SBram Moolenaar
5340e655111SBram Moolenaar  call StopShellInTerminal(term_buf)
5350e655111SBram Moolenaar  call delete('Xtest_mks.out')
5360e655111SBram Moolenaarendfunc
5370e655111SBram Moolenaar
538c2c82056SBram Moolenaarfunc Test_mkview_terminal_windows()
539c2c82056SBram Moolenaar  CheckFeature terminal
540c2c82056SBram Moolenaar
541c2c82056SBram Moolenaar  " create two window on the same terminal to check this is handled OK
542c2c82056SBram Moolenaar  terminal
543c2c82056SBram Moolenaar  let term_buf = bufnr()
544c2c82056SBram Moolenaar  exe 'sbuf ' .. term_buf
545c2c82056SBram Moolenaar  mkview! Xtestview
546c2c82056SBram Moolenaar
547c2c82056SBram Moolenaar  call StopShellInTerminal(term_buf)
548c2c82056SBram Moolenaar  call delete('Xtestview')
549c2c82056SBram Moolenaarendfunc
5504bebc9a0SBram Moolenaar
551f9547eb6SBram Moolenaarfunc Test_mkview_open_folds()
552f9547eb6SBram Moolenaar  enew!
553f9547eb6SBram Moolenaar
554f9547eb6SBram Moolenaar  call append(0, ['a', 'b', 'c'])
555f9547eb6SBram Moolenaar  1,3fold
556f9547eb6SBram Moolenaar  " zR affects 'foldlevel', make sure the option is applied after the folds
557f9547eb6SBram Moolenaar  " have been recreated.
558f9547eb6SBram Moolenaar  normal zR
559f9547eb6SBram Moolenaar  write! Xtestfile
560f9547eb6SBram Moolenaar
561f9547eb6SBram Moolenaar  call assert_equal(-1, foldclosed(1))
562f9547eb6SBram Moolenaar  call assert_equal(-1, foldclosed(2))
563f9547eb6SBram Moolenaar  call assert_equal(-1, foldclosed(3))
564f9547eb6SBram Moolenaar
565f9547eb6SBram Moolenaar  mkview! Xtestview
566f9547eb6SBram Moolenaar  source Xtestview
567f9547eb6SBram Moolenaar
568f9547eb6SBram Moolenaar  call assert_equal(-1, foldclosed(1))
569f9547eb6SBram Moolenaar  call assert_equal(-1, foldclosed(2))
570f9547eb6SBram Moolenaar  call assert_equal(-1, foldclosed(3))
571f9547eb6SBram Moolenaar
572f9547eb6SBram Moolenaar  call delete('Xtestview')
573f9547eb6SBram Moolenaar  call delete('Xtestfile')
574f9547eb6SBram Moolenaar  %bwipe
575f9547eb6SBram Moolenaarendfunc
576f9547eb6SBram Moolenaar
577139348f3SBram Moolenaarfunc Test_mkview_no_balt()
578139348f3SBram Moolenaar  edit Xtestfile1
579139348f3SBram Moolenaar  edit Xtestfile2
580139348f3SBram Moolenaar
581139348f3SBram Moolenaar  mkview! Xtestview
582139348f3SBram Moolenaar  bdelete Xtestfile1
583139348f3SBram Moolenaar
584139348f3SBram Moolenaar  source Xtestview
585139348f3SBram Moolenaar  call assert_equal(0, buflisted('Xtestfile1'))
586139348f3SBram Moolenaar
587139348f3SBram Moolenaar  call delete('Xtestview')
588139348f3SBram Moolenaar  %bwipe
589139348f3SBram Moolenaarendfunc
590139348f3SBram Moolenaar
5910756f757SBram Moolenaarfunc Test_mksession_no_balt()
5920756f757SBram Moolenaar  edit Xtestfile1
5930756f757SBram Moolenaar  edit Xtestfile2
5940756f757SBram Moolenaar
5950756f757SBram Moolenaar  bdelete Xtestfile1
5960756f757SBram Moolenaar  mksession! Xtestview
5970756f757SBram Moolenaar
5980756f757SBram Moolenaar  source Xtestview
5990756f757SBram Moolenaar  call assert_equal(0, buflisted('Xtestfile1'))
6000756f757SBram Moolenaar
6010756f757SBram Moolenaar  call delete('Xtestview')
6020756f757SBram Moolenaar  %bwipe
6030756f757SBram Moolenaarendfunc
6040756f757SBram Moolenaar
605627cb6a6SBram Moolenaar" Test :mkview with a file argument.
606627cb6a6SBram Moolenaarfunc Test_mkview_file()
607627cb6a6SBram Moolenaar  " Create a view with line number and a fold.
608627cb6a6SBram Moolenaar  help :mkview
609627cb6a6SBram Moolenaar  set number
6102bf4fe07SBram Moolenaar  norm! V}zf0
611dd5d18eaSBram Moolenaar  let pos = getpos('.')
612627cb6a6SBram Moolenaar  let linefoldclosed1 = foldclosed('.')
613627cb6a6SBram Moolenaar  mkview! Xview
614627cb6a6SBram Moolenaar  set nonumber
615627cb6a6SBram Moolenaar  norm! zrj
616627cb6a6SBram Moolenaar  " We can close the help window, as mkview with a file name should
617627cb6a6SBram Moolenaar  " generate a command to edit the file.
618627cb6a6SBram Moolenaar  helpclose
619627cb6a6SBram Moolenaar
620627cb6a6SBram Moolenaar  source Xview
621627cb6a6SBram Moolenaar  call assert_equal(1, &number)
622627cb6a6SBram Moolenaar  call assert_match('\*:mkview\*$', getline('.'))
623dd5d18eaSBram Moolenaar  call assert_equal(pos, getpos('.'))
624627cb6a6SBram Moolenaar  call assert_equal(linefoldclosed1, foldclosed('.'))
625627cb6a6SBram Moolenaar
626627cb6a6SBram Moolenaar  " Creating a view again with the same file name should fail (file
627627cb6a6SBram Moolenaar  " already exists). But with a !, the previous view should be
628627cb6a6SBram Moolenaar  " overwritten without error.
629627cb6a6SBram Moolenaar  help :loadview
630627cb6a6SBram Moolenaar  call assert_fails('mkview Xview', 'E189:')
631627cb6a6SBram Moolenaar  call assert_match('\*:loadview\*$', getline('.'))
632627cb6a6SBram Moolenaar  mkview! Xview
633627cb6a6SBram Moolenaar  call assert_match('\*:loadview\*$', getline('.'))
634627cb6a6SBram Moolenaar
635627cb6a6SBram Moolenaar  call delete('Xview')
636627cb6a6SBram Moolenaar  bwipe
637627cb6a6SBram Moolenaarendfunc
638627cb6a6SBram Moolenaar
639627cb6a6SBram Moolenaar" Test :mkview and :loadview with a custom 'viewdir'.
640627cb6a6SBram Moolenaarfunc Test_mkview_loadview_with_viewdir()
641627cb6a6SBram Moolenaar  set viewdir=Xviewdir
642627cb6a6SBram Moolenaar
643627cb6a6SBram Moolenaar  help :mkview
644627cb6a6SBram Moolenaar  set number
645627cb6a6SBram Moolenaar  norm! V}zf
646dd5d18eaSBram Moolenaar  let pos = getpos('.')
647627cb6a6SBram Moolenaar  let linefoldclosed1 = foldclosed('.')
648627cb6a6SBram Moolenaar  mkview 1
649627cb6a6SBram Moolenaar  set nonumber
650627cb6a6SBram Moolenaar  norm! zrj
651627cb6a6SBram Moolenaar
652627cb6a6SBram Moolenaar  loadview 1
653627cb6a6SBram Moolenaar
654627cb6a6SBram Moolenaar  " The directory Xviewdir/ should have been created and the view
655627cb6a6SBram Moolenaar  " should be stored in that directory.
656627cb6a6SBram Moolenaar  call assert_equal('Xviewdir/' .
657627cb6a6SBram Moolenaar        \           substitute(
658627cb6a6SBram Moolenaar        \             substitute(
659627cb6a6SBram Moolenaar        \               expand('%:p'), '/', '=+', 'g'), ':', '=-', 'g') . '=1.vim',
660627cb6a6SBram Moolenaar        \           glob('Xviewdir/*'))
661627cb6a6SBram Moolenaar  call assert_equal(1, &number)
662627cb6a6SBram Moolenaar  call assert_match('\*:mkview\*$', getline('.'))
663dd5d18eaSBram Moolenaar  call assert_equal(pos, getpos('.'))
664627cb6a6SBram Moolenaar  call assert_equal(linefoldclosed1, foldclosed('.'))
665627cb6a6SBram Moolenaar
666627cb6a6SBram Moolenaar  call delete('Xviewdir', 'rf')
667627cb6a6SBram Moolenaar  set viewdir&
668627cb6a6SBram Moolenaar  helpclose
669627cb6a6SBram Moolenaarendfunc
670627cb6a6SBram Moolenaar
671627cb6a6SBram Moolenaarfunc Test_mkview_no_file_name()
672627cb6a6SBram Moolenaar  new
673627cb6a6SBram Moolenaar  " :mkview or :mkview {nr} should fail in a unnamed buffer.
674627cb6a6SBram Moolenaar  call assert_fails('mkview', 'E32:')
675627cb6a6SBram Moolenaar  call assert_fails('mkview 1', 'E32:')
676627cb6a6SBram Moolenaar
677627cb6a6SBram Moolenaar  " :mkview {file} should succeed in a unnamed buffer.
678627cb6a6SBram Moolenaar  mkview Xview
679627cb6a6SBram Moolenaar  help
680627cb6a6SBram Moolenaar  source Xview
681627cb6a6SBram Moolenaar  call assert_equal('', bufname('%'))
682627cb6a6SBram Moolenaar
683627cb6a6SBram Moolenaar  call delete('Xview')
684627cb6a6SBram Moolenaar  %bwipe
685627cb6a6SBram Moolenaarendfunc
68679da563cSBram Moolenaar
6873482be6aSBram Moolenaarfunc Test_mkview_loadview_jumplist()
6883482be6aSBram Moolenaar  set viewdir=Xviewdir
6893482be6aSBram Moolenaar  au BufWinLeave * silent mkview
6903482be6aSBram Moolenaar  au BufWinEnter * silent loadview
6913482be6aSBram Moolenaar
6923482be6aSBram Moolenaar  edit Xfile1
6933482be6aSBram Moolenaar  call setline(1, ['a', 'bbbbbbb', 'c'])
6943482be6aSBram Moolenaar  normal j3l
6953482be6aSBram Moolenaar  call assert_equal([2, 4], getcurpos()[1:2])
6963482be6aSBram Moolenaar  write
6973482be6aSBram Moolenaar
6983482be6aSBram Moolenaar  edit Xfile2
6993482be6aSBram Moolenaar  call setline(1, ['d', 'eeeeeee', 'f'])
7003482be6aSBram Moolenaar  normal j5l
7013482be6aSBram Moolenaar  call assert_equal([2, 6], getcurpos()[1:2])
7023482be6aSBram Moolenaar  write
7033482be6aSBram Moolenaar
7043482be6aSBram Moolenaar  edit Xfile3
7053482be6aSBram Moolenaar  call setline(1, ['g', 'h', 'iiiii'])
7063482be6aSBram Moolenaar  normal jj3l
7073482be6aSBram Moolenaar  call assert_equal([3, 4], getcurpos()[1:2])
7083482be6aSBram Moolenaar  write
7093482be6aSBram Moolenaar
7103482be6aSBram Moolenaar  edit Xfile1
7113482be6aSBram Moolenaar  call assert_equal([2, 4], getcurpos()[1:2])
7123482be6aSBram Moolenaar  edit Xfile2
7133482be6aSBram Moolenaar  call assert_equal([2, 6], getcurpos()[1:2])
7143482be6aSBram Moolenaar  edit Xfile3
7153482be6aSBram Moolenaar  call assert_equal([3, 4], getcurpos()[1:2])
7163482be6aSBram Moolenaar
7173482be6aSBram Moolenaar  exe "normal \<C-O>"
7183482be6aSBram Moolenaar  call assert_equal('Xfile2', expand('%'))
7193482be6aSBram Moolenaar  call assert_equal([2, 6], getcurpos()[1:2])
7203482be6aSBram Moolenaar  exe "normal \<C-O>"
7213482be6aSBram Moolenaar  call assert_equal('Xfile1', expand('%'))
7223482be6aSBram Moolenaar  call assert_equal([2, 4], getcurpos()[1:2])
7233482be6aSBram Moolenaar
7243482be6aSBram Moolenaar  au! BufWinLeave
7253482be6aSBram Moolenaar  au! BufWinEnter
7263482be6aSBram Moolenaar  bwipe!
7273482be6aSBram Moolenaar  call delete('Xviewdir', 'rf')
7283482be6aSBram Moolenaar  call delete('Xfile1')
7293482be6aSBram Moolenaar  call delete('Xfile2')
7303482be6aSBram Moolenaar  call delete('Xfile3')
7313482be6aSBram Moolenaar  set viewdir&
7323482be6aSBram Moolenaarendfunc
7333482be6aSBram Moolenaar
734555de4e3SBram Moolenaar" A clean session (one empty buffer, one window, and one tab) should not
735555de4e3SBram Moolenaar" set any error messages when sourced because no commands should fail.
736555de4e3SBram Moolenaarfunc Test_mksession_no_errmsg()
737555de4e3SBram Moolenaar  let v:errmsg = ''
738555de4e3SBram Moolenaar  %bwipe!
739555de4e3SBram Moolenaar  mksession! Xtest_mks.out
740555de4e3SBram Moolenaar  source Xtest_mks.out
741555de4e3SBram Moolenaar  call assert_equal('', v:errmsg)
742555de4e3SBram Moolenaar  call delete('Xtest_mks.out')
743555de4e3SBram Moolenaarendfunc
744555de4e3SBram Moolenaar
745ad36a358SBram Moolenaarfunc Test_mksession_quote_in_filename()
7469e79ccbeSBram Moolenaar  " only Unix can handle this weird filename
7476d91bcb4SBram Moolenaar  CheckUnix
7486d91bcb4SBram Moolenaar
749ad36a358SBram Moolenaar  let v:errmsg = ''
750ad36a358SBram Moolenaar  %bwipe!
751ad36a358SBram Moolenaar  split another
752ad36a358SBram Moolenaar  split x'y\"z
753ad36a358SBram Moolenaar  mksession! Xtest_mks_quoted.out
754ad36a358SBram Moolenaar  %bwipe!
755ad36a358SBram Moolenaar  source Xtest_mks_quoted.out
756ad36a358SBram Moolenaar  call assert_true(bufexists("x'y\"z"))
757ad36a358SBram Moolenaar
758ad36a358SBram Moolenaar  %bwipe!
759ad36a358SBram Moolenaar  call delete('Xtest_mks_quoted.out')
760ad36a358SBram Moolenaarendfunc
761ad36a358SBram Moolenaar
76266f0e6c6SBram Moolenaar" Test for storing global variables in a session file
76366f0e6c6SBram Moolenaarfunc Test_mksession_globals()
76466f0e6c6SBram Moolenaar  set sessionoptions+=globals
76566f0e6c6SBram Moolenaar
76666f0e6c6SBram Moolenaar  " create different global variables
767ee1a2b5aSBram Moolenaar  let g:Global_string = "Sun is shining\r\n"
76866f0e6c6SBram Moolenaar  let g:Global_count = 100
76966f0e6c6SBram Moolenaar  let g:Global_pi = 3.14
770ee1a2b5aSBram Moolenaar  let g:Global_neg_float = -2.68
77166f0e6c6SBram Moolenaar
77266f0e6c6SBram Moolenaar  mksession! Xtest_mks.out
77366f0e6c6SBram Moolenaar
77466f0e6c6SBram Moolenaar  unlet g:Global_string
77566f0e6c6SBram Moolenaar  unlet g:Global_count
77666f0e6c6SBram Moolenaar  unlet g:Global_pi
777ee1a2b5aSBram Moolenaar  unlet g:Global_neg_float
77866f0e6c6SBram Moolenaar
77966f0e6c6SBram Moolenaar  source Xtest_mks.out
780ee1a2b5aSBram Moolenaar  call assert_equal("Sun is shining\r\n", g:Global_string)
78166f0e6c6SBram Moolenaar  call assert_equal(100, g:Global_count)
78266f0e6c6SBram Moolenaar  call assert_equal(3.14, g:Global_pi)
783ee1a2b5aSBram Moolenaar  call assert_equal(-2.68, g:Global_neg_float)
78466f0e6c6SBram Moolenaar
78566f0e6c6SBram Moolenaar  unlet g:Global_string
78666f0e6c6SBram Moolenaar  unlet g:Global_count
78766f0e6c6SBram Moolenaar  unlet g:Global_pi
788ee1a2b5aSBram Moolenaar  unlet g:Global_neg_float
78966f0e6c6SBram Moolenaar  call delete('Xtest_mks.out')
79066f0e6c6SBram Moolenaar  set sessionoptions&
79166f0e6c6SBram Moolenaarendfunc
79266f0e6c6SBram Moolenaar
79366f0e6c6SBram Moolenaar" Test for changing backslash to forward slash in filenames
79466f0e6c6SBram Moolenaarfunc Test_mksession_slash()
79537ac4a53SBram Moolenaar  if exists('+shellslash')
79637ac4a53SBram Moolenaar    throw 'Skipped: cannot use backslash in file name'
79737ac4a53SBram Moolenaar  endif
79866f0e6c6SBram Moolenaar  enew
79966f0e6c6SBram Moolenaar  %bwipe!
80066f0e6c6SBram Moolenaar  e a\\b\\c
80166f0e6c6SBram Moolenaar  mksession! Xtest_mks1.out
80266f0e6c6SBram Moolenaar  set sessionoptions+=slash
80366f0e6c6SBram Moolenaar  mksession! Xtest_mks2.out
80466f0e6c6SBram Moolenaar
80566f0e6c6SBram Moolenaar  %bwipe!
80666f0e6c6SBram Moolenaar  source Xtest_mks1.out
80766f0e6c6SBram Moolenaar  call assert_equal('a\b\c', bufname(''))
80866f0e6c6SBram Moolenaar  %bwipe!
80966f0e6c6SBram Moolenaar  source Xtest_mks2.out
81066f0e6c6SBram Moolenaar  call assert_equal('a/b/c', bufname(''))
81166f0e6c6SBram Moolenaar
81266f0e6c6SBram Moolenaar  %bwipe!
81366f0e6c6SBram Moolenaar  call delete('Xtest_mks1.out')
81466f0e6c6SBram Moolenaar  call delete('Xtest_mks2.out')
81566f0e6c6SBram Moolenaar  set sessionoptions&
81666f0e6c6SBram Moolenaarendfunc
81766f0e6c6SBram Moolenaar
81866f0e6c6SBram Moolenaar" Test for changing directory to the session file directory
81966f0e6c6SBram Moolenaarfunc Test_mksession_sesdir()
8205bf46e97SBram Moolenaar  let save_cwd = getcwd()
82166f0e6c6SBram Moolenaar  call mkdir('Xproj')
82266f0e6c6SBram Moolenaar  mksession! Xproj/Xtest_mks1.out
82366f0e6c6SBram Moolenaar  set sessionoptions-=curdir
82466f0e6c6SBram Moolenaar  set sessionoptions+=sesdir
82566f0e6c6SBram Moolenaar  mksession! Xproj/Xtest_mks2.out
82666f0e6c6SBram Moolenaar
82766f0e6c6SBram Moolenaar  source Xproj/Xtest_mks1.out
82866f0e6c6SBram Moolenaar  call assert_equal('testdir', fnamemodify(getcwd(), ':t'))
82966f0e6c6SBram Moolenaar  source Xproj/Xtest_mks2.out
83066f0e6c6SBram Moolenaar  call assert_equal('Xproj', fnamemodify(getcwd(), ':t'))
8315bf46e97SBram Moolenaar  call chdir(save_cwd)
8325bf46e97SBram Moolenaar  %bwipe
83366f0e6c6SBram Moolenaar
83466f0e6c6SBram Moolenaar  set sessionoptions&
83566f0e6c6SBram Moolenaar  call delete('Xproj', 'rf')
83666f0e6c6SBram Moolenaarendfunc
83766f0e6c6SBram Moolenaar
83866f0e6c6SBram Moolenaar" Test for storing the 'lines' and 'columns' settings
83966f0e6c6SBram Moolenaarfunc Test_mksession_resize()
84066f0e6c6SBram Moolenaar  mksession! Xtest_mks1.out
84166f0e6c6SBram Moolenaar  set sessionoptions+=resize
84266f0e6c6SBram Moolenaar  mksession! Xtest_mks2.out
84366f0e6c6SBram Moolenaar
84466f0e6c6SBram Moolenaar  let lines = readfile('Xtest_mks1.out')
84566f0e6c6SBram Moolenaar  let found_resize = v:false
84666f0e6c6SBram Moolenaar  for line in lines
84766f0e6c6SBram Moolenaar    if line =~ '^set lines='
84866f0e6c6SBram Moolenaar      let found_resize = v:true
849ee1a2b5aSBram Moolenaar      break
85066f0e6c6SBram Moolenaar    endif
85166f0e6c6SBram Moolenaar  endfor
852ee1a2b5aSBram Moolenaar  call assert_false(found_resize)
85366f0e6c6SBram Moolenaar  let lines = readfile('Xtest_mks2.out')
85466f0e6c6SBram Moolenaar  let found_resize = v:false
85566f0e6c6SBram Moolenaar  for line in lines
85666f0e6c6SBram Moolenaar    if line =~ '^set lines='
85766f0e6c6SBram Moolenaar      let found_resize = v:true
858ee1a2b5aSBram Moolenaar      break
85966f0e6c6SBram Moolenaar    endif
86066f0e6c6SBram Moolenaar  endfor
861ee1a2b5aSBram Moolenaar  call assert_true(found_resize)
86266f0e6c6SBram Moolenaar
86366f0e6c6SBram Moolenaar  call delete('Xtest_mks1.out')
86466f0e6c6SBram Moolenaar  call delete('Xtest_mks2.out')
86566f0e6c6SBram Moolenaar  set sessionoptions&
86666f0e6c6SBram Moolenaarendfunc
86766f0e6c6SBram Moolenaar
868ee1a2b5aSBram Moolenaar" Test for mksession with a named scratch buffer
869ee1a2b5aSBram Moolenaarfunc Test_mksession_scratch()
870ee1a2b5aSBram Moolenaar  enew | only
871ee1a2b5aSBram Moolenaar  file Xscratch
872ee1a2b5aSBram Moolenaar  set buftype=nofile
873ee1a2b5aSBram Moolenaar  mksession! Xtest_mks.out
874ee1a2b5aSBram Moolenaar  %bwipe
875ee1a2b5aSBram Moolenaar  source Xtest_mks.out
876ee1a2b5aSBram Moolenaar  call assert_equal('Xscratch', bufname(''))
877ee1a2b5aSBram Moolenaar  call assert_equal('nofile', &buftype)
878ee1a2b5aSBram Moolenaar  %bwipe
879ee1a2b5aSBram Moolenaar  call delete('Xtest_mks.out')
880ee1a2b5aSBram Moolenaarendfunc
881ee1a2b5aSBram Moolenaar
882ee1a2b5aSBram Moolenaar" Test for mksession with fold options
883ee1a2b5aSBram Moolenaarfunc Test_mksession_foldopt()
884ee1a2b5aSBram Moolenaar  set sessionoptions-=options
885ee1a2b5aSBram Moolenaar  set sessionoptions+=folds
886ee1a2b5aSBram Moolenaar  new
887ee1a2b5aSBram Moolenaar  setlocal foldenable
888ee1a2b5aSBram Moolenaar  setlocal foldmethod=expr
889ee1a2b5aSBram Moolenaar  setlocal foldmarker=<<<,>>>
890ee1a2b5aSBram Moolenaar  setlocal foldignore=%
891ee1a2b5aSBram Moolenaar  setlocal foldlevel=2
892ee1a2b5aSBram Moolenaar  setlocal foldminlines=10
893ee1a2b5aSBram Moolenaar  setlocal foldnestmax=15
894ee1a2b5aSBram Moolenaar  mksession! Xtest_mks.out
895ee1a2b5aSBram Moolenaar  close
896ee1a2b5aSBram Moolenaar  %bwipe
897ee1a2b5aSBram Moolenaar
898ee1a2b5aSBram Moolenaar  source Xtest_mks.out
899ee1a2b5aSBram Moolenaar  call assert_true(&foldenable)
900ee1a2b5aSBram Moolenaar  call assert_equal('expr', &foldmethod)
901ee1a2b5aSBram Moolenaar  call assert_equal('<<<,>>>', &foldmarker)
902ee1a2b5aSBram Moolenaar  call assert_equal('%', &foldignore)
903ee1a2b5aSBram Moolenaar  call assert_equal(2, &foldlevel)
904ee1a2b5aSBram Moolenaar  call assert_equal(10, &foldminlines)
905ee1a2b5aSBram Moolenaar  call assert_equal(15, &foldnestmax)
906ee1a2b5aSBram Moolenaar
907ee1a2b5aSBram Moolenaar  close
908ee1a2b5aSBram Moolenaar  %bwipe
909ee1a2b5aSBram Moolenaar  set sessionoptions&
910ee1a2b5aSBram Moolenaarendfunc
911ee1a2b5aSBram Moolenaar
912ee1a2b5aSBram Moolenaar" Test for mksession with window position
913ee1a2b5aSBram Moolenaarfunc Test_mksession_winpos()
914ee1a2b5aSBram Moolenaar  " Only applicable in GUI Vim
9156d91bcb4SBram Moolenaar  CheckGui
9166d91bcb4SBram Moolenaar
917ee1a2b5aSBram Moolenaar  set sessionoptions+=winpos
918ee1a2b5aSBram Moolenaar  mksession! Xtest_mks.out
919ee1a2b5aSBram Moolenaar  let found_winpos = v:false
920ee1a2b5aSBram Moolenaar  let lines = readfile('Xtest_mks.out')
921ee1a2b5aSBram Moolenaar  for line in lines
922ee1a2b5aSBram Moolenaar    if line =~ '^winpos '
923ee1a2b5aSBram Moolenaar      let found_winpos = v:true
924ee1a2b5aSBram Moolenaar      break
925ee1a2b5aSBram Moolenaar    endif
926ee1a2b5aSBram Moolenaar  endfor
927ee1a2b5aSBram Moolenaar  call assert_true(found_winpos)
928ee1a2b5aSBram Moolenaar  call delete('Xtest_mks.out')
929ee1a2b5aSBram Moolenaar  set sessionoptions&
930ee1a2b5aSBram Moolenaarendfunc
931ee1a2b5aSBram Moolenaar
9320995c81fSBram Moolenaar" Test for mksession without options restores winminheight
9330995c81fSBram Moolenaarfunc Test_mksession_winminheight()
9340995c81fSBram Moolenaar  set sessionoptions-=options
9350995c81fSBram Moolenaar  split
9360995c81fSBram Moolenaar  mksession! Xtest_mks.out
9370995c81fSBram Moolenaar  let found_restore = 0
9380995c81fSBram Moolenaar  let lines = readfile('Xtest_mks.out')
9390995c81fSBram Moolenaar  for line in lines
9400995c81fSBram Moolenaar    if line =~ '= s:save_winmin\(width\|height\)'
9410995c81fSBram Moolenaar      let found_restore += 1
9420995c81fSBram Moolenaar    endif
9430995c81fSBram Moolenaar  endfor
9440995c81fSBram Moolenaar  call assert_equal(2, found_restore)
9450995c81fSBram Moolenaar  call delete('Xtest_mks.out')
9460995c81fSBram Moolenaar  close
9470995c81fSBram Moolenaar  set sessionoptions&
9480995c81fSBram Moolenaarendfunc
9490995c81fSBram Moolenaar
950ee1a2b5aSBram Moolenaar" Test for mksession with 'compatible' option
951ee1a2b5aSBram Moolenaarfunc Test_mksession_compatible()
952ee1a2b5aSBram Moolenaar  mksession! Xtest_mks1.out
953ee1a2b5aSBram Moolenaar  set compatible
954ee1a2b5aSBram Moolenaar  mksession! Xtest_mks2.out
955ee1a2b5aSBram Moolenaar  set nocp
956ee1a2b5aSBram Moolenaar
957ee1a2b5aSBram Moolenaar  let test_success = v:false
958ee1a2b5aSBram Moolenaar  let lines = readfile('Xtest_mks1.out')
959ee1a2b5aSBram Moolenaar  for line in lines
960ee1a2b5aSBram Moolenaar    if line =~ '^if &cp | set nocp | endif'
961ee1a2b5aSBram Moolenaar      let test_success = v:true
962ee1a2b5aSBram Moolenaar      break
963ee1a2b5aSBram Moolenaar    endif
964ee1a2b5aSBram Moolenaar  endfor
965ee1a2b5aSBram Moolenaar  call assert_true(test_success)
966ee1a2b5aSBram Moolenaar
967ee1a2b5aSBram Moolenaar  let test_success = v:false
968ee1a2b5aSBram Moolenaar  let lines = readfile('Xtest_mks2.out')
969ee1a2b5aSBram Moolenaar  for line in lines
970ee1a2b5aSBram Moolenaar    if line =~ '^if !&cp | set cp | endif'
971ee1a2b5aSBram Moolenaar      let test_success = v:true
972ee1a2b5aSBram Moolenaar      break
973ee1a2b5aSBram Moolenaar    endif
974ee1a2b5aSBram Moolenaar  endfor
975ee1a2b5aSBram Moolenaar  call assert_true(test_success)
976ee1a2b5aSBram Moolenaar
977ee1a2b5aSBram Moolenaar  call delete('Xtest_mks1.out')
978ee1a2b5aSBram Moolenaar  call delete('Xtest_mks2.out')
979ee1a2b5aSBram Moolenaar  set compatible&
980ee1a2b5aSBram Moolenaar  set sessionoptions&
981ee1a2b5aSBram Moolenaarendfunc
982ee1a2b5aSBram Moolenaar
9838750026aSBram Moolenaarfunc s:ClearMappings()
9848750026aSBram Moolenaar  mapclear
9858750026aSBram Moolenaar  omapclear
9868750026aSBram Moolenaar  mapclear!
9878750026aSBram Moolenaar  lmapclear
9888750026aSBram Moolenaar  tmapclear
9898750026aSBram Moolenaarendfunc
9908750026aSBram Moolenaar
9918750026aSBram Moolenaarfunc Test_mkvimrc()
9928750026aSBram Moolenaar  let entries = [
9938750026aSBram Moolenaar        \ ['', 'nothing', '<Nop>'],
9948750026aSBram Moolenaar        \ ['n', 'normal', 'NORMAL'],
9958750026aSBram Moolenaar        \ ['v', 'visual', 'VISUAL'],
9968750026aSBram Moolenaar        \ ['s', 'select', 'SELECT'],
9978750026aSBram Moolenaar        \ ['x', 'visualonly', 'VISUALONLY'],
9988750026aSBram Moolenaar        \ ['o', 'operator', 'OPERATOR'],
9998750026aSBram Moolenaar        \ ['i', 'insert', 'INSERT'],
10008750026aSBram Moolenaar        \ ['l', 'lang', 'LANG'],
10018750026aSBram Moolenaar        \ ['c', 'command', 'COMMAND'],
10028750026aSBram Moolenaar        \ ['t', 'terminal', 'TERMINAL'],
10038750026aSBram Moolenaar        \ ]
10048750026aSBram Moolenaar  for entry in entries
10058750026aSBram Moolenaar    exe entry[0] .. 'map ' .. entry[1] .. ' ' .. entry[2]
10068750026aSBram Moolenaar  endfor
10078750026aSBram Moolenaar
10088750026aSBram Moolenaar  mkvimrc Xtestvimrc
10098750026aSBram Moolenaar
10108750026aSBram Moolenaar  call s:ClearMappings()
10118750026aSBram Moolenaar  for entry in entries
10128750026aSBram Moolenaar    call assert_equal('', maparg(entry[1], entry[0]))
10138750026aSBram Moolenaar  endfor
10148750026aSBram Moolenaar
10158750026aSBram Moolenaar  source Xtestvimrc
10168750026aSBram Moolenaar
10178750026aSBram Moolenaar  for entry in entries
10188750026aSBram Moolenaar    call assert_equal(entry[2], maparg(entry[1], entry[0]))
10198750026aSBram Moolenaar  endfor
10208750026aSBram Moolenaar
10218750026aSBram Moolenaar  call s:ClearMappings()
1022*59585497SYegappan Lakshmanan
1023*59585497SYegappan Lakshmanan  " the 'pastetoggle', 'wildchar' and 'wildcharm' option values should be
1024*59585497SYegappan Lakshmanan  " stored as key names in the vimrc file
1025*59585497SYegappan Lakshmanan  set pastetoggle=<F5>
1026*59585497SYegappan Lakshmanan  set wildchar=<F6>
1027*59585497SYegappan Lakshmanan  set wildcharm=<F7>
1028*59585497SYegappan Lakshmanan  call assert_fails('mkvimrc Xtestvimrc')
1029*59585497SYegappan Lakshmanan  mkvimrc! Xtestvimrc
1030*59585497SYegappan Lakshmanan  call assert_notequal(-1, index(readfile('Xtestvimrc'), 'set pastetoggle=<F5>'))
1031*59585497SYegappan Lakshmanan  call assert_notequal(-1, index(readfile('Xtestvimrc'), 'set wildchar=<F6>'))
1032*59585497SYegappan Lakshmanan  call assert_notequal(-1, index(readfile('Xtestvimrc'), 'set wildcharm=<F7>'))
1033*59585497SYegappan Lakshmanan  set pastetoggle& wildchar& wildcharm&
1034*59585497SYegappan Lakshmanan
10358750026aSBram Moolenaar  call delete('Xtestvimrc')
10368750026aSBram Moolenaarendfunc
10378750026aSBram Moolenaar
103838890835SBram Moolenaarfunc Test_scrolloff()
103938890835SBram Moolenaar  set sessionoptions+=localoptions
104038890835SBram Moolenaar  setlocal so=1 siso=1
104138890835SBram Moolenaar  mksession! Xtest_mks.out
104238890835SBram Moolenaar  setlocal so=-1 siso=-1
104338890835SBram Moolenaar  source Xtest_mks.out
104438890835SBram Moolenaar  call assert_equal(1, &l:so)
104538890835SBram Moolenaar  call assert_equal(1, &l:siso)
104638890835SBram Moolenaar  call delete('Xtest_mks.out')
104738890835SBram Moolenaar  setlocal so& siso&
104838890835SBram Moolenaar  set sessionoptions&
104938890835SBram Moolenaarendfunc
105038890835SBram Moolenaar
10513482be6aSBram Moolenaarfunc Test_altfile()
10523482be6aSBram Moolenaar  edit Xone
10533482be6aSBram Moolenaar  split Xtwo
10543482be6aSBram Moolenaar  edit Xtwoalt
10553482be6aSBram Moolenaar  edit #
10563482be6aSBram Moolenaar  wincmd w
10573482be6aSBram Moolenaar  edit Xonealt
10583482be6aSBram Moolenaar  edit #
10593482be6aSBram Moolenaar  mksession! Xtest_altfile
10603482be6aSBram Moolenaar  only
10613482be6aSBram Moolenaar  bwipe Xonealt
10623482be6aSBram Moolenaar  bwipe Xtwoalt
10633482be6aSBram Moolenaar  bwipe!
10643482be6aSBram Moolenaar  source Xtest_altfile
10653482be6aSBram Moolenaar  call assert_equal('Xone', bufname())
10663482be6aSBram Moolenaar  call assert_equal('Xonealt', bufname('#'))
10673482be6aSBram Moolenaar  wincmd w
10683482be6aSBram Moolenaar  call assert_equal('Xtwo', bufname())
10693482be6aSBram Moolenaar  call assert_equal('Xtwoalt', bufname('#'))
10703482be6aSBram Moolenaar  only
10713482be6aSBram Moolenaar  bwipe!
1072ac665c24SBram Moolenaar  call delete('Xtest_altfile')
10733482be6aSBram Moolenaarendfunc
10743482be6aSBram Moolenaar
10755c504f68SBram Moolenaar" Test for creating views with manual folds
10765c504f68SBram Moolenaarfunc Test_mkview_manual_fold()
10775c504f68SBram Moolenaar  call writefile(range(1,10), 'Xfile')
10785c504f68SBram Moolenaar  new Xfile
10795c504f68SBram Moolenaar  " create recursive folds
10805c504f68SBram Moolenaar  5,6fold
10815c504f68SBram Moolenaar  4,7fold
10825c504f68SBram Moolenaar  mkview Xview
10835c504f68SBram Moolenaar  normal zE
10845c504f68SBram Moolenaar  source Xview
10855c504f68SBram Moolenaar  call assert_equal([-1, 4, 4, 4, 4, -1], [foldclosed(3), foldclosed(4),
10865c504f68SBram Moolenaar        \ foldclosed(5), foldclosed(6), foldclosed(7), foldclosed(8)])
10875c504f68SBram Moolenaar  " open one level of fold
10885c504f68SBram Moolenaar  4foldopen
10895c504f68SBram Moolenaar  mkview! Xview
10905c504f68SBram Moolenaar  normal zE
10915c504f68SBram Moolenaar  source Xview
10925c504f68SBram Moolenaar  call assert_equal([-1, -1, 5, 5, -1, -1], [foldclosed(3), foldclosed(4),
10935c504f68SBram Moolenaar        \ foldclosed(5), foldclosed(6), foldclosed(7), foldclosed(8)])
10945c504f68SBram Moolenaar  " open all the folds
10955c504f68SBram Moolenaar  %foldopen!
10965c504f68SBram Moolenaar  mkview! Xview
10975c504f68SBram Moolenaar  normal zE
10985c504f68SBram Moolenaar  source Xview
10995c504f68SBram Moolenaar  call assert_equal([-1, -1, -1, -1, -1, -1], [foldclosed(3), foldclosed(4),
11005c504f68SBram Moolenaar        \ foldclosed(5), foldclosed(6), foldclosed(7), foldclosed(8)])
11015c504f68SBram Moolenaar  call delete('Xfile')
11025c504f68SBram Moolenaar  call delete('Xview')
11035c504f68SBram Moolenaar  bw!
11045c504f68SBram Moolenaarendfunc
11055c504f68SBram Moolenaar
1106eca626fcSBram Moolenaar" vim: shiftwidth=2 sts=2 expandtab
1107