xref: /vim-8.2.3635/src/testdir/test_viminfo.vim (revision 5affc034)
1b20e3348SBram Moolenaar" Test for reading and writing .viminfo
2b20e3348SBram Moolenaar
36bd1d770SBram Moolenaarsource check.vim
48e6be343SBram Moolenaarsource term_util.vim
58e6be343SBram Moolenaarsource shared.vim
66bd1d770SBram Moolenaar
7156919f9SBram Moolenaarfunction Test_viminfo_read_and_write()
826b654a5SBram Moolenaar  " First clear 'history', so that "hislen" is zero.  Then set it again,
926b654a5SBram Moolenaar  " simulating Vim starting up.
1026b654a5SBram Moolenaar  set history=0
1126b654a5SBram Moolenaar  wviminfo Xviminfo
1226b654a5SBram Moolenaar  set history=1000
1326b654a5SBram Moolenaar
1445d2eeaaSBram Moolenaar  call histdel(':')
15b20e3348SBram Moolenaar  let lines = [
16b20e3348SBram Moolenaar	\ '# comment line',
17b20e3348SBram Moolenaar	\ '*encoding=utf-8',
18b20e3348SBram Moolenaar	\ '~MSle0~/asdf',
19b20e3348SBram Moolenaar	\ '|copied as-is',
20b20e3348SBram Moolenaar	\ '|and one more',
21b20e3348SBram Moolenaar	\ ]
22b20e3348SBram Moolenaar  call writefile(lines, 'Xviminfo')
23b20e3348SBram Moolenaar  rviminfo Xviminfo
24b20e3348SBram Moolenaar  call assert_equal('asdf', @/)
25b20e3348SBram Moolenaar
26b20e3348SBram Moolenaar  wviminfo Xviminfo
27b20e3348SBram Moolenaar  let lines = readfile('Xviminfo')
28b20e3348SBram Moolenaar  let done = 0
29b20e3348SBram Moolenaar  for line in lines
30156919f9SBram Moolenaar    if line[0] == '|' && line !~ '^|[234],' && line !~ '^|<'
31b20e3348SBram Moolenaar      if done == 0
322d358997SBram Moolenaar	call assert_equal('|1,4', line)
33b20e3348SBram Moolenaar      elseif done == 1
3445d2eeaaSBram Moolenaar	call assert_equal('|copied as-is', line)
3545d2eeaaSBram Moolenaar      elseif done == 2
36b20e3348SBram Moolenaar	call assert_equal('|and one more', line)
37b20e3348SBram Moolenaar      endif
38b20e3348SBram Moolenaar      let done += 1
39b20e3348SBram Moolenaar    endif
40b20e3348SBram Moolenaar  endfor
4145d2eeaaSBram Moolenaar  call assert_equal(3, done)
42b20e3348SBram Moolenaar
43b20e3348SBram Moolenaar  call delete('Xviminfo')
44b20e3348SBram Moolenaarendfunc
45b20e3348SBram Moolenaar
46b20e3348SBram Moolenaarfunc Test_global_vars()
472a8d3b89SBram Moolenaar  let g:MY_GLOBAL_STRING = "Vim Editor"
482a8d3b89SBram Moolenaar  let g:MY_GLOBAL_NUM = 345
492a8d3b89SBram Moolenaar  let g:MY_GLOBAL_FLOAT = 3.14
50b20e3348SBram Moolenaar  let test_dict = {'foo': 1, 'bar': 0, 'longvarible': 1000}
51b20e3348SBram Moolenaar  let g:MY_GLOBAL_DICT = test_dict
52b20e3348SBram Moolenaar  " store a really long list, so line wrapping will occur in viminfo file
53b20e3348SBram Moolenaar  let test_list = range(1,100)
54b20e3348SBram Moolenaar  let g:MY_GLOBAL_LIST = test_list
558c8b8bb5SBram Moolenaar  let test_blob = 0z00112233445566778899aabbccddeeff
568c8b8bb5SBram Moolenaar  let g:MY_GLOBAL_BLOB = test_blob
578c8b8bb5SBram Moolenaar  let test_false = v:false
588c8b8bb5SBram Moolenaar  let g:MY_GLOBAL_FALSE = test_false
598c8b8bb5SBram Moolenaar  let test_true = v:true
608c8b8bb5SBram Moolenaar  let g:MY_GLOBAL_TRUE = test_true
618c8b8bb5SBram Moolenaar  let test_null = v:null
628c8b8bb5SBram Moolenaar  let g:MY_GLOBAL_NULL = test_null
638c8b8bb5SBram Moolenaar  let test_none = v:none
648c8b8bb5SBram Moolenaar  let g:MY_GLOBAL_NONE = test_none
658c8b8bb5SBram Moolenaar
66e9c07270SBram Moolenaar  set viminfo='100,<50,s10,h,!,nviminfo
67b20e3348SBram Moolenaar  wv! Xviminfo
688c8b8bb5SBram Moolenaar
692a8d3b89SBram Moolenaar  unlet g:MY_GLOBAL_STRING
702a8d3b89SBram Moolenaar  unlet g:MY_GLOBAL_NUM
712a8d3b89SBram Moolenaar  unlet g:MY_GLOBAL_FLOAT
72b20e3348SBram Moolenaar  unlet g:MY_GLOBAL_DICT
73b20e3348SBram Moolenaar  unlet g:MY_GLOBAL_LIST
748c8b8bb5SBram Moolenaar  unlet g:MY_GLOBAL_BLOB
758c8b8bb5SBram Moolenaar  unlet g:MY_GLOBAL_FALSE
768c8b8bb5SBram Moolenaar  unlet g:MY_GLOBAL_TRUE
778c8b8bb5SBram Moolenaar  unlet g:MY_GLOBAL_NULL
788c8b8bb5SBram Moolenaar  unlet g:MY_GLOBAL_NONE
79b20e3348SBram Moolenaar
80b20e3348SBram Moolenaar  rv! Xviminfo
812a8d3b89SBram Moolenaar  call assert_equal("Vim Editor", g:MY_GLOBAL_STRING)
822a8d3b89SBram Moolenaar  call assert_equal(345, g:MY_GLOBAL_NUM)
832a8d3b89SBram Moolenaar  call assert_equal(3.14, g:MY_GLOBAL_FLOAT)
84b20e3348SBram Moolenaar  call assert_equal(test_dict, g:MY_GLOBAL_DICT)
85b20e3348SBram Moolenaar  call assert_equal(test_list, g:MY_GLOBAL_LIST)
868c8b8bb5SBram Moolenaar  call assert_equal(test_blob, g:MY_GLOBAL_BLOB)
878c8b8bb5SBram Moolenaar  call assert_equal(test_false, g:MY_GLOBAL_FALSE)
888c8b8bb5SBram Moolenaar  call assert_equal(test_true, g:MY_GLOBAL_TRUE)
898c8b8bb5SBram Moolenaar  call assert_equal(test_null, g:MY_GLOBAL_NULL)
908c8b8bb5SBram Moolenaar  call assert_equal(test_none, g:MY_GLOBAL_NONE)
91b20e3348SBram Moolenaar
92845e0ee5SBram Moolenaar  " Test for invalid values for a blob, list, dict in a viminfo file
93845e0ee5SBram Moolenaar  call writefile([
94845e0ee5SBram Moolenaar        \ "!GLOB_BLOB_1\tBLO\t123",
95845e0ee5SBram Moolenaar        \ "!GLOB_BLOB_2\tBLO\t012",
96845e0ee5SBram Moolenaar        \ "!GLOB_BLOB_3\tBLO\t0z1x",
97845e0ee5SBram Moolenaar        \ "!GLOB_BLOB_4\tBLO\t0z12 ab",
98845e0ee5SBram Moolenaar        \ "!GLOB_LIST_1\tLIS\t1 2",
99845e0ee5SBram Moolenaar        \ "!GLOB_DICT_1\tDIC\t1 2"], 'Xviminfo')
100845e0ee5SBram Moolenaar  call assert_fails('rv! Xviminfo', 'E15:')
101845e0ee5SBram Moolenaar  call assert_equal('123', g:GLOB_BLOB_1)
102845e0ee5SBram Moolenaar  call assert_equal(1, type(g:GLOB_BLOB_1))
103845e0ee5SBram Moolenaar  call assert_equal('012', g:GLOB_BLOB_2)
104845e0ee5SBram Moolenaar  call assert_equal(1, type(g:GLOB_BLOB_2))
105845e0ee5SBram Moolenaar  call assert_equal('0z1x', g:GLOB_BLOB_3)
106845e0ee5SBram Moolenaar  call assert_equal(1, type(g:GLOB_BLOB_3))
107845e0ee5SBram Moolenaar  call assert_equal('0z12 ab', g:GLOB_BLOB_4)
108845e0ee5SBram Moolenaar  call assert_equal(1, type(g:GLOB_BLOB_4))
109845e0ee5SBram Moolenaar  call assert_equal('1 2', g:GLOB_LIST_1)
110845e0ee5SBram Moolenaar  call assert_equal(1, type(g:GLOB_LIST_1))
111845e0ee5SBram Moolenaar  call assert_equal('1 2', g:GLOB_DICT_1)
112845e0ee5SBram Moolenaar  call assert_equal(1, type(g:GLOB_DICT_1))
113845e0ee5SBram Moolenaar
114b20e3348SBram Moolenaar  call delete('Xviminfo')
115b20e3348SBram Moolenaar  set viminfo-=!
116b20e3348SBram Moolenaarendfunc
11745d2eeaaSBram Moolenaar
1185b157fe2SBram Moolenaarfunc Test_global_vars_with_circular_reference()
1195b157fe2SBram Moolenaar  let g:MY_GLOBAL_LIST = []
1205b157fe2SBram Moolenaar  call add(g:MY_GLOBAL_LIST, g:MY_GLOBAL_LIST)
1215b157fe2SBram Moolenaar  let g:MY_GLOBAL_DICT = {}
1225b157fe2SBram Moolenaar  let g:MY_GLOBAL_DICT['self'] = g:MY_GLOBAL_DICT
1235b157fe2SBram Moolenaar
1245b157fe2SBram Moolenaar  set viminfo='100,<50,s10,h,!,nviminfo
1255b157fe2SBram Moolenaar  wv! Xviminfo
1265b157fe2SBram Moolenaar  call assert_equal(v:errmsg, '')
1275b157fe2SBram Moolenaar
1285b157fe2SBram Moolenaar  unlet g:MY_GLOBAL_LIST
1295b157fe2SBram Moolenaar  unlet g:MY_GLOBAL_DICT
1305b157fe2SBram Moolenaar
1315b157fe2SBram Moolenaar  rv! Xviminfo
1325b157fe2SBram Moolenaar  call assert_equal(v:errmsg, '')
1335b157fe2SBram Moolenaar  call assert_true(!exists('g:MY_GLOBAL_LIST'))
1345b157fe2SBram Moolenaar  call assert_true(!exists('g:MY_GLOBAL_DICT'))
1355b157fe2SBram Moolenaar
1365b157fe2SBram Moolenaar  call delete('Xviminfo')
1375b157fe2SBram Moolenaar  set viminfo-=!
1385b157fe2SBram Moolenaarendfunc
1395b157fe2SBram Moolenaar
14045d2eeaaSBram Moolenaarfunc Test_cmdline_history()
14145d2eeaaSBram Moolenaar  call histdel(':')
14245d2eeaaSBram Moolenaar  call test_settime(11)
14345d2eeaaSBram Moolenaar  call histadd(':', "echo 'one'")
14445d2eeaaSBram Moolenaar  call test_settime(12)
14545d2eeaaSBram Moolenaar  " split into two lines
14645d2eeaaSBram Moolenaar  let long800 = repeat(" 'eight'", 100)
14745d2eeaaSBram Moolenaar  call histadd(':', "echo " . long800)
14845d2eeaaSBram Moolenaar  call test_settime(13)
14945d2eeaaSBram Moolenaar  " split into three lines
15045d2eeaaSBram Moolenaar  let long1400 = repeat(" 'fourteeeeen'", 100)
15145d2eeaaSBram Moolenaar  call histadd(':', "echo " . long1400)
15245d2eeaaSBram Moolenaar  wviminfo Xviminfo
15345d2eeaaSBram Moolenaar  let lines = readfile('Xviminfo')
15445d2eeaaSBram Moolenaar  let done_colon = 0
15545d2eeaaSBram Moolenaar  let done_bar = 0
15645d2eeaaSBram Moolenaar  let lnum = 0
15745d2eeaaSBram Moolenaar  while lnum < len(lines)
15845d2eeaaSBram Moolenaar    let line = lines[lnum] | let lnum += 1
15945d2eeaaSBram Moolenaar    if line[0] == ':'
16045d2eeaaSBram Moolenaar      if done_colon == 0
16145d2eeaaSBram Moolenaar	call assert_equal(":\x161408", line)
16245d2eeaaSBram Moolenaar	let line = lines[lnum] | let lnum += 1
16345d2eeaaSBram Moolenaar	call assert_equal('<echo ' . long1400, line)
16445d2eeaaSBram Moolenaar      elseif done_colon == 1
16545d2eeaaSBram Moolenaar	call assert_equal(":\x16808", line)
16645d2eeaaSBram Moolenaar	let line = lines[lnum] | let lnum += 1
16745d2eeaaSBram Moolenaar	call assert_equal("<echo " . long800, line)
16845d2eeaaSBram Moolenaar      elseif done_colon == 2
16945d2eeaaSBram Moolenaar	call assert_equal(":echo 'one'", line)
17045d2eeaaSBram Moolenaar      endif
17145d2eeaaSBram Moolenaar      let done_colon += 1
17245d2eeaaSBram Moolenaar    elseif line[0:4] == '|2,0,'
17345d2eeaaSBram Moolenaar      if done_bar == 0
17445d2eeaaSBram Moolenaar	call assert_equal("|2,0,13,,>1407", line)
17545d2eeaaSBram Moolenaar	let line = lines[lnum] | let lnum += 1
17645d2eeaaSBram Moolenaar	call assert_equal('|<"echo ' . long1400[0:484], line)
17745d2eeaaSBram Moolenaar	let line = lines[lnum] | let lnum += 1
17845d2eeaaSBram Moolenaar	call assert_equal('|<' . long1400[485:974], line)
17945d2eeaaSBram Moolenaar	let line = lines[lnum] | let lnum += 1
18045d2eeaaSBram Moolenaar	call assert_equal('|<' . long1400[975:] . '"', line)
18145d2eeaaSBram Moolenaar      elseif done_bar == 1
18245d2eeaaSBram Moolenaar	call assert_equal('|2,0,12,,>807', line)
18345d2eeaaSBram Moolenaar	let line = lines[lnum] | let lnum += 1
18445d2eeaaSBram Moolenaar	call assert_equal('|<"echo ' . long800[0:484], line)
18545d2eeaaSBram Moolenaar	let line = lines[lnum] | let lnum += 1
18645d2eeaaSBram Moolenaar	call assert_equal('|<' . long800[485:] . '"', line)
18745d2eeaaSBram Moolenaar      elseif done_bar == 2
18845d2eeaaSBram Moolenaar	call assert_equal("|2,0,11,,\"echo 'one'\"", line)
18945d2eeaaSBram Moolenaar      endif
19045d2eeaaSBram Moolenaar      let done_bar += 1
19145d2eeaaSBram Moolenaar    endif
19245d2eeaaSBram Moolenaar  endwhile
19345d2eeaaSBram Moolenaar  call assert_equal(3, done_colon)
19445d2eeaaSBram Moolenaar  call assert_equal(3, done_bar)
19545d2eeaaSBram Moolenaar
19645d2eeaaSBram Moolenaar  call histdel(':')
19745d2eeaaSBram Moolenaar  rviminfo Xviminfo
19845d2eeaaSBram Moolenaar  call assert_equal("echo " . long1400, histget(':', -1))
19945d2eeaaSBram Moolenaar  call assert_equal("echo " . long800, histget(':', -2))
20045d2eeaaSBram Moolenaar  call assert_equal("echo 'one'", histget(':', -3))
20145d2eeaaSBram Moolenaar
20245d2eeaaSBram Moolenaar  call delete('Xviminfo')
20345d2eeaaSBram Moolenaarendfunc
2041fd99c1cSBram Moolenaar
2051fd99c1cSBram Moolenaarfunc Test_cmdline_history_order()
2061fd99c1cSBram Moolenaar  call histdel(':')
2071fd99c1cSBram Moolenaar  call test_settime(11)
2081fd99c1cSBram Moolenaar  call histadd(':', "echo '11'")
2091fd99c1cSBram Moolenaar  call test_settime(22)
2101fd99c1cSBram Moolenaar  call histadd(':', "echo '22'")
2111fd99c1cSBram Moolenaar  call test_settime(33)
2121fd99c1cSBram Moolenaar  call histadd(':', "echo '33'")
2131fd99c1cSBram Moolenaar  wviminfo Xviminfo
2141fd99c1cSBram Moolenaar
2151fd99c1cSBram Moolenaar  call histdel(':')
2161fd99c1cSBram Moolenaar  " items go in between
2171fd99c1cSBram Moolenaar  call test_settime(15)
2181fd99c1cSBram Moolenaar  call histadd(':', "echo '15'")
2191fd99c1cSBram Moolenaar  call test_settime(27)
2201fd99c1cSBram Moolenaar  call histadd(':', "echo '27'")
2211fd99c1cSBram Moolenaar
2221fd99c1cSBram Moolenaar  rviminfo Xviminfo
2231fd99c1cSBram Moolenaar  call assert_equal("echo '33'", histget(':', -1))
2241fd99c1cSBram Moolenaar  call assert_equal("echo '27'", histget(':', -2))
2251fd99c1cSBram Moolenaar  call assert_equal("echo '22'", histget(':', -3))
2261fd99c1cSBram Moolenaar  call assert_equal("echo '15'", histget(':', -4))
2271fd99c1cSBram Moolenaar  call assert_equal("echo '11'", histget(':', -5))
2281fd99c1cSBram Moolenaar
2291fd99c1cSBram Moolenaar  call histdel(':')
2301fd99c1cSBram Moolenaar  " items go before and after
231ce90e36fSBram Moolenaar  eval 8->test_settime()
2321fd99c1cSBram Moolenaar  call histadd(':', "echo '8'")
2331fd99c1cSBram Moolenaar  call test_settime(39)
2341fd99c1cSBram Moolenaar  call histadd(':', "echo '39'")
2351fd99c1cSBram Moolenaar
2361fd99c1cSBram Moolenaar  rviminfo Xviminfo
2371fd99c1cSBram Moolenaar  call assert_equal("echo '39'", histget(':', -1))
2381fd99c1cSBram Moolenaar  call assert_equal("echo '33'", histget(':', -2))
2391fd99c1cSBram Moolenaar  call assert_equal("echo '22'", histget(':', -3))
2401fd99c1cSBram Moolenaar  call assert_equal("echo '11'", histget(':', -4))
2411fd99c1cSBram Moolenaar  call assert_equal("echo '8'", histget(':', -5))
2421fd99c1cSBram Moolenaar
2431fd99c1cSBram Moolenaar  " Check sorting works when writing with merge.
2441fd99c1cSBram Moolenaar  call histdel(':')
2451fd99c1cSBram Moolenaar  call test_settime(8)
2461fd99c1cSBram Moolenaar  call histadd(':', "echo '8'")
2471fd99c1cSBram Moolenaar  call test_settime(15)
2481fd99c1cSBram Moolenaar  call histadd(':', "echo '15'")
2491fd99c1cSBram Moolenaar  call test_settime(27)
2501fd99c1cSBram Moolenaar  call histadd(':', "echo '27'")
2511fd99c1cSBram Moolenaar  call test_settime(39)
2521fd99c1cSBram Moolenaar  call histadd(':', "echo '39'")
2531fd99c1cSBram Moolenaar  wviminfo Xviminfo
2541fd99c1cSBram Moolenaar
2551fd99c1cSBram Moolenaar  call histdel(':')
2561fd99c1cSBram Moolenaar  rviminfo Xviminfo
2571fd99c1cSBram Moolenaar  call assert_equal("echo '39'", histget(':', -1))
2581fd99c1cSBram Moolenaar  call assert_equal("echo '33'", histget(':', -2))
2591fd99c1cSBram Moolenaar  call assert_equal("echo '27'", histget(':', -3))
2601fd99c1cSBram Moolenaar  call assert_equal("echo '22'", histget(':', -4))
2611fd99c1cSBram Moolenaar  call assert_equal("echo '15'", histget(':', -5))
2621fd99c1cSBram Moolenaar  call assert_equal("echo '11'", histget(':', -6))
2631fd99c1cSBram Moolenaar  call assert_equal("echo '8'", histget(':', -7))
2641fd99c1cSBram Moolenaar
2651fd99c1cSBram Moolenaar  call delete('Xviminfo')
2661fd99c1cSBram Moolenaarendfunc
26701227093SBram Moolenaar
268e80ff744SBram Moolenaarfunc Test_viminfo_registers()
269e80ff744SBram Moolenaar  call test_settime(8)
270e80ff744SBram Moolenaar  call setreg('a', "eight", 'c')
271e80ff744SBram Moolenaar  call test_settime(20)
272e80ff744SBram Moolenaar  call setreg('b', ["twenty", "again"], 'l')
273e80ff744SBram Moolenaar  call test_settime(40)
274e80ff744SBram Moolenaar  call setreg('c', ["four", "agai"], 'b4')
275e80ff744SBram Moolenaar  let l = []
276e80ff744SBram Moolenaar  set viminfo='100,<600,s10,h,!,nviminfo
277e80ff744SBram Moolenaar  for i in range(500)
278e80ff744SBram Moolenaar    call add(l, 'something')
279e80ff744SBram Moolenaar  endfor
280e80ff744SBram Moolenaar  call setreg('d', l, 'l')
2812a8d3b89SBram Moolenaar  call setreg('e', "abc\<C-V>xyz")
282e80ff744SBram Moolenaar  wviminfo Xviminfo
283e80ff744SBram Moolenaar
284e80ff744SBram Moolenaar  call test_settime(10)
285e80ff744SBram Moolenaar  call setreg('a', '', 'b10')
286e80ff744SBram Moolenaar  call test_settime(15)
287e80ff744SBram Moolenaar  call setreg('b', 'drop')
288e80ff744SBram Moolenaar  call test_settime(50)
289e80ff744SBram Moolenaar  call setreg('c', 'keep', 'l')
290e80ff744SBram Moolenaar  call test_settime(30)
291e80ff744SBram Moolenaar  call setreg('d', 'drop', 'l')
2922a8d3b89SBram Moolenaar  call setreg('e', 'drop')
293e80ff744SBram Moolenaar  rviminfo Xviminfo
294e80ff744SBram Moolenaar
295e80ff744SBram Moolenaar  call assert_equal("", getreg('a'))
296e80ff744SBram Moolenaar  call assert_equal("\<C-V>10", getregtype('a'))
297e80ff744SBram Moolenaar  call assert_equal("twenty\nagain\n", getreg('b'))
298e80ff744SBram Moolenaar  call assert_equal("V", getregtype('b'))
299e80ff744SBram Moolenaar  call assert_equal("keep\n", getreg('c'))
300e80ff744SBram Moolenaar  call assert_equal("V", getregtype('c'))
301e80ff744SBram Moolenaar  call assert_equal(l, getreg('d', 1, 1))
302e80ff744SBram Moolenaar  call assert_equal("V", getregtype('d'))
3032a8d3b89SBram Moolenaar  call assert_equal("abc\<C-V>xyz", getreg('e'))
304e80ff744SBram Moolenaar
30525709576SBram Moolenaar  " Length around 440 switches to line continuation.
30625709576SBram Moolenaar  let len = 434
30725709576SBram Moolenaar  while len < 445
30825709576SBram Moolenaar    let s = repeat('a', len)
30925709576SBram Moolenaar    call setreg('"', s)
31025709576SBram Moolenaar    wviminfo Xviminfo
31125709576SBram Moolenaar    call setreg('"', '')
31225709576SBram Moolenaar    rviminfo Xviminfo
31325709576SBram Moolenaar    call assert_equal(s, getreg('"'), 'wrong register at length: ' . len)
31425709576SBram Moolenaar
31525709576SBram Moolenaar    let len += 1
31625709576SBram Moolenaar  endwhile
31725709576SBram Moolenaar
318e80ff744SBram Moolenaar  call delete('Xviminfo')
319e80ff744SBram Moolenaarendfunc
320e80ff744SBram Moolenaar
3212d358997SBram Moolenaarfunc Test_viminfo_marks()
3222d358997SBram Moolenaar  sp bufa
3232d358997SBram Moolenaar  let bufa = bufnr('%')
3242d358997SBram Moolenaar  sp bufb
3252d358997SBram Moolenaar  let bufb = bufnr('%')
3262d358997SBram Moolenaar
3272d358997SBram Moolenaar  call test_settime(8)
3282d358997SBram Moolenaar  call setpos("'A", [bufa, 1, 1, 0])
3292d358997SBram Moolenaar  call test_settime(20)
3302d358997SBram Moolenaar  call setpos("'B", [bufb, 9, 1, 0])
3312d358997SBram Moolenaar  call setpos("'C", [bufa, 7, 1, 0])
3322d358997SBram Moolenaar
3332d358997SBram Moolenaar  delmark 0-9
3342d358997SBram Moolenaar  call test_settime(25)
3352d358997SBram Moolenaar  call setpos("'1", [bufb, 12, 1, 0])
3362d358997SBram Moolenaar  call test_settime(35)
3372d358997SBram Moolenaar  call setpos("'0", [bufa, 11, 1, 0])
3382d358997SBram Moolenaar
3392d358997SBram Moolenaar  call test_settime(45)
3402d358997SBram Moolenaar  wviminfo Xviminfo
3412d358997SBram Moolenaar
3422d358997SBram Moolenaar  " Writing viminfo inserts the '0 mark.
3432d358997SBram Moolenaar  call assert_equal([bufb, 1, 1, 0], getpos("'0"))
3442d358997SBram Moolenaar  call assert_equal([bufa, 11, 1, 0], getpos("'1"))
3452d358997SBram Moolenaar  call assert_equal([bufb, 12, 1, 0], getpos("'2"))
3462d358997SBram Moolenaar
3472d358997SBram Moolenaar  call test_settime(4)
3482d358997SBram Moolenaar  call setpos("'A", [bufa, 9, 1, 0])
3492d358997SBram Moolenaar  call test_settime(30)
3502d358997SBram Moolenaar  call setpos("'B", [bufb, 2, 3, 0])
3512d358997SBram Moolenaar  delmark C
3522d358997SBram Moolenaar
3532d358997SBram Moolenaar  delmark 0-9
3542d358997SBram Moolenaar  call test_settime(30)
3552d358997SBram Moolenaar  call setpos("'1", [bufb, 22, 1, 0])
3562d358997SBram Moolenaar  call test_settime(55)
3572d358997SBram Moolenaar  call setpos("'0", [bufa, 21, 1, 0])
3582d358997SBram Moolenaar
3592d358997SBram Moolenaar  rviminfo Xviminfo
3602d358997SBram Moolenaar
3612d358997SBram Moolenaar  call assert_equal([bufa, 1, 1, 0], getpos("'A"))
3622d358997SBram Moolenaar  call assert_equal([bufb, 2, 3, 0], getpos("'B"))
3632d358997SBram Moolenaar  call assert_equal([bufa, 7, 1, 0], getpos("'C"))
3642d358997SBram Moolenaar
3652d358997SBram Moolenaar  " numbered marks are merged
3662d358997SBram Moolenaar  call assert_equal([bufa, 21, 1, 0], getpos("'0"))  " time 55
3672d358997SBram Moolenaar  call assert_equal([bufb, 1, 1, 0], getpos("'1"))  " time 45
3682d358997SBram Moolenaar  call assert_equal([bufa, 11, 1, 0], getpos("'2")) " time 35
3692d358997SBram Moolenaar  call assert_equal([bufb, 22, 1, 0], getpos("'3")) " time 30
3702d358997SBram Moolenaar  call assert_equal([bufb, 12, 1, 0], getpos("'4")) " time 25
3712d358997SBram Moolenaar
3728cd6cd80SBram Moolenaar  " deleted file marks are removed from viminfo
3738cd6cd80SBram Moolenaar  delmark C
3748cd6cd80SBram Moolenaar  wviminfo Xviminfo
3758cd6cd80SBram Moolenaar  rviminfo Xviminfo
3768cd6cd80SBram Moolenaar  call assert_equal([0, 0, 0, 0], getpos("'C"))
3778cd6cd80SBram Moolenaar
3788cd6cd80SBram Moolenaar  " deleted file marks stay in viminfo if defined in another vim later
3798cd6cd80SBram Moolenaar  call test_settime(70)
3808cd6cd80SBram Moolenaar  call setpos("'D", [bufb, 8, 1, 0])
3818cd6cd80SBram Moolenaar  wviminfo Xviminfo
3828cd6cd80SBram Moolenaar  call test_settime(65)
3838cd6cd80SBram Moolenaar  delmark D
3848cd6cd80SBram Moolenaar  call assert_equal([0, 0, 0, 0], getpos("'D"))
3858cd6cd80SBram Moolenaar  call test_settime(75)
3868cd6cd80SBram Moolenaar  rviminfo Xviminfo
3878cd6cd80SBram Moolenaar  call assert_equal([bufb, 8, 1, 0], getpos("'D"))
3888cd6cd80SBram Moolenaar
3892d358997SBram Moolenaar  call delete('Xviminfo')
3902d358997SBram Moolenaar  exe 'bwipe ' . bufa
3912d358997SBram Moolenaar  exe 'bwipe ' . bufb
3922d358997SBram Moolenaarendfunc
3932d358997SBram Moolenaar
3942d358997SBram Moolenaarfunc Test_viminfo_jumplist()
3952d358997SBram Moolenaar  split testbuf
3962d358997SBram Moolenaar  clearjumps
3972d358997SBram Moolenaar  call setline(1, ['time 05', 'time 10', 'time 15', 'time 20', 'time 30', 'last pos'])
3982d358997SBram Moolenaar  call cursor(2, 1)
3992d358997SBram Moolenaar  call test_settime(10)
4002d358997SBram Moolenaar  exe "normal /20\r"
4012d358997SBram Moolenaar  call test_settime(20)
4022d358997SBram Moolenaar  exe "normal /30\r"
4032d358997SBram Moolenaar  call test_settime(30)
4042d358997SBram Moolenaar  exe "normal /last pos\r"
4052d358997SBram Moolenaar  wviminfo Xviminfo
4062d358997SBram Moolenaar
4072d358997SBram Moolenaar  clearjumps
4082d358997SBram Moolenaar  call cursor(1, 1)
4092d358997SBram Moolenaar  call test_settime(5)
4102d358997SBram Moolenaar  exe "normal /15\r"
4112d358997SBram Moolenaar  call test_settime(15)
4122d358997SBram Moolenaar  exe "normal /last pos\r"
4132d358997SBram Moolenaar  call test_settime(40)
4142d358997SBram Moolenaar  exe "normal ?30\r"
4152d358997SBram Moolenaar  rviminfo Xviminfo
4162d358997SBram Moolenaar
4172d358997SBram Moolenaar  call assert_equal('time 30', getline('.'))
4182d358997SBram Moolenaar  exe "normal \<C-O>"
4192d358997SBram Moolenaar  call assert_equal('last pos', getline('.'))
4202d358997SBram Moolenaar  exe "normal \<C-O>"
4212d358997SBram Moolenaar  " duplicate for 'time 30' was removed
4222d358997SBram Moolenaar  call assert_equal('time 20', getline('.'))
4232d358997SBram Moolenaar  exe "normal \<C-O>"
4242d358997SBram Moolenaar  call assert_equal('time 15', getline('.'))
4252d358997SBram Moolenaar  exe "normal \<C-O>"
4262d358997SBram Moolenaar  call assert_equal('time 10', getline('.'))
4272d358997SBram Moolenaar  exe "normal \<C-O>"
4282d358997SBram Moolenaar  call assert_equal('time 05', getline('.'))
4292d358997SBram Moolenaar
430ece74ab1SBram Moolenaar  clearjumps
431ece74ab1SBram Moolenaar  call cursor(1, 1)
432ece74ab1SBram Moolenaar  call test_settime(5)
433ece74ab1SBram Moolenaar  exe "normal /15\r"
434ece74ab1SBram Moolenaar  call test_settime(15)
435ece74ab1SBram Moolenaar  exe "normal /last pos\r"
436ece74ab1SBram Moolenaar  call test_settime(40)
437ece74ab1SBram Moolenaar  exe "normal ?30\r"
438ece74ab1SBram Moolenaar  " Test merge when writing
439ece74ab1SBram Moolenaar  wviminfo Xviminfo
440ece74ab1SBram Moolenaar  clearjumps
441ece74ab1SBram Moolenaar  rviminfo Xviminfo
442ece74ab1SBram Moolenaar
44328607ba2SBram Moolenaar  let last_line = line('.')
444ece74ab1SBram Moolenaar  exe "normal \<C-O>"
445ece74ab1SBram Moolenaar  call assert_equal('time 30', getline('.'))
446ece74ab1SBram Moolenaar  exe "normal \<C-O>"
447ece74ab1SBram Moolenaar  call assert_equal('last pos', getline('.'))
448ece74ab1SBram Moolenaar  exe "normal \<C-O>"
449ece74ab1SBram Moolenaar  " duplicate for 'time 30' was removed
450ece74ab1SBram Moolenaar  call assert_equal('time 20', getline('.'))
451ece74ab1SBram Moolenaar  exe "normal \<C-O>"
452ece74ab1SBram Moolenaar  call assert_equal('time 15', getline('.'))
453ece74ab1SBram Moolenaar  exe "normal \<C-O>"
454ece74ab1SBram Moolenaar  call assert_equal('time 10', getline('.'))
455ece74ab1SBram Moolenaar  exe "normal \<C-O>"
456ece74ab1SBram Moolenaar  call assert_equal('time 05', getline('.'))
457ece74ab1SBram Moolenaar
45828607ba2SBram Moolenaar  " Test with jumplist full.
45928607ba2SBram Moolenaar  clearjumps
46028607ba2SBram Moolenaar  call setline(1, repeat(['match here'], 101))
46128607ba2SBram Moolenaar  call cursor(1, 1)
46228607ba2SBram Moolenaar  call test_settime(10)
46328607ba2SBram Moolenaar  for i in range(100)
46428607ba2SBram Moolenaar    exe "normal /here\r"
46528607ba2SBram Moolenaar  endfor
46628607ba2SBram Moolenaar  rviminfo Xviminfo
46728607ba2SBram Moolenaar
46828607ba2SBram Moolenaar  " must be newest mark that comes from viminfo.
46928607ba2SBram Moolenaar  exe "normal \<C-O>"
47028607ba2SBram Moolenaar  call assert_equal(last_line, line('.'))
47128607ba2SBram Moolenaar
4722d358997SBram Moolenaar  bwipe!
4732d358997SBram Moolenaar  call delete('Xviminfo')
4742d358997SBram Moolenaarendfunc
4752d358997SBram Moolenaar
47601227093SBram Moolenaarfunc Test_viminfo_encoding()
47701227093SBram Moolenaar  set enc=latin1
47801227093SBram Moolenaar  call histdel(':')
47901227093SBram Moolenaar  call histadd(':', "echo '\xe9'")
48001227093SBram Moolenaar  wviminfo Xviminfo
48101227093SBram Moolenaar
48201227093SBram Moolenaar  set fencs=utf-8,latin1
48301227093SBram Moolenaar  set enc=utf-8
48401227093SBram Moolenaar  sp Xviminfo
48501227093SBram Moolenaar  call assert_equal('latin1', &fenc)
48601227093SBram Moolenaar  close
48701227093SBram Moolenaar
48801227093SBram Moolenaar  call histdel(':')
48901227093SBram Moolenaar  rviminfo Xviminfo
49001227093SBram Moolenaar  call assert_equal("echo 'é'", histget(':', -1))
49101227093SBram Moolenaar
49201227093SBram Moolenaar  call delete('Xviminfo')
49301227093SBram Moolenaarendfunc
49462f8b4e1SBram Moolenaar
49562f8b4e1SBram Moolenaarfunc Test_viminfo_bad_syntax()
49662f8b4e1SBram Moolenaar  let lines = []
49762f8b4e1SBram Moolenaar  call add(lines, '|<')  " empty continuation line
49862f8b4e1SBram Moolenaar  call add(lines, '|234234234234234324,nothing')
49962f8b4e1SBram Moolenaar  call add(lines, '|1+"no comma"')
50062f8b4e1SBram Moolenaar  call add(lines, '|1,2,3,4,5,6,7')  " too many items
50162f8b4e1SBram Moolenaar  call add(lines, '|1,"string version"')
50262f8b4e1SBram Moolenaar  call add(lines, '|1,>x') " bad continuation line
50362f8b4e1SBram Moolenaar  call add(lines, '|1,"x') " missing quote
50462f8b4e1SBram Moolenaar  call add(lines, '|1,"x\') " trailing backslash
50562f8b4e1SBram Moolenaar  call add(lines, '|1,,,,') "trailing comma
50662f8b4e1SBram Moolenaar  call add(lines, '|1,>234') " trailing continuation line
50762f8b4e1SBram Moolenaar  call writefile(lines, 'Xviminfo')
508e80ff744SBram Moolenaar  rviminfo Xviminfo
50962f8b4e1SBram Moolenaar
51062f8b4e1SBram Moolenaar  call delete('Xviminfo')
51162f8b4e1SBram Moolenaarendfunc
51262f8b4e1SBram Moolenaar
513ab9c89b6SBram Moolenaarfunc Test_viminfo_file_marks()
514ab9c89b6SBram Moolenaar  silent! bwipe test_viminfo.vim
515ab9c89b6SBram Moolenaar  silent! bwipe Xviminfo
516ab9c89b6SBram Moolenaar
517ab9c89b6SBram Moolenaar  call test_settime(10)
518ab9c89b6SBram Moolenaar  edit ten
519ab9c89b6SBram Moolenaar  call test_settime(25)
520ab9c89b6SBram Moolenaar  edit again
521ab9c89b6SBram Moolenaar  call test_settime(30)
522ab9c89b6SBram Moolenaar  edit thirty
523ab9c89b6SBram Moolenaar  wviminfo Xviminfo
524ab9c89b6SBram Moolenaar
525ab9c89b6SBram Moolenaar  call test_settime(20)
526ab9c89b6SBram Moolenaar  edit twenty
527ab9c89b6SBram Moolenaar  call test_settime(35)
528ab9c89b6SBram Moolenaar  edit again
529ab9c89b6SBram Moolenaar  call test_settime(40)
530ab9c89b6SBram Moolenaar  edit fourty
531ab9c89b6SBram Moolenaar  wviminfo Xviminfo
532ab9c89b6SBram Moolenaar
533ab9c89b6SBram Moolenaar  sp Xviminfo
534ab9c89b6SBram Moolenaar  1
535ab9c89b6SBram Moolenaar  for name in ['fourty', 'again', 'thirty', 'twenty', 'ten']
536ab9c89b6SBram Moolenaar    /^>
537ab9c89b6SBram Moolenaar    call assert_equal(name, substitute(getline('.'), '.*/', '', ''))
538ab9c89b6SBram Moolenaar  endfor
539ab9c89b6SBram Moolenaar  close
540ab9c89b6SBram Moolenaar
541ab9c89b6SBram Moolenaar  call delete('Xviminfo')
542ab9c89b6SBram Moolenaarendfunc
543e59215c7SBram Moolenaar
544e59215c7SBram Moolenaarfunc Test_viminfo_file_mark_tabclose()
545e59215c7SBram Moolenaar  tabnew Xtestfileintab
546e59215c7SBram Moolenaar  call setline(1, ['a','b','c','d','e'])
547e59215c7SBram Moolenaar  4
548e59215c7SBram Moolenaar  q!
549e59215c7SBram Moolenaar  wviminfo Xviminfo
550e59215c7SBram Moolenaar  sp Xviminfo
551e59215c7SBram Moolenaar  /^> .*Xtestfileintab
552e59215c7SBram Moolenaar  let lnum = line('.')
553e59215c7SBram Moolenaar  while 1
554e59215c7SBram Moolenaar    if lnum == line('$')
55537175409SBram Moolenaar      call assert_report('mark not found in Xtestfileintab')
556e59215c7SBram Moolenaar      break
557e59215c7SBram Moolenaar    endif
558e59215c7SBram Moolenaar    let lnum += 1
559e59215c7SBram Moolenaar    let line = getline(lnum)
560e59215c7SBram Moolenaar    if line == ''
56137175409SBram Moolenaar      call assert_report('mark not found in Xtestfileintab')
562e59215c7SBram Moolenaar      break
563e59215c7SBram Moolenaar    endif
564e59215c7SBram Moolenaar    if line =~ "^\t\""
565e59215c7SBram Moolenaar      call assert_equal('4', substitute(line, ".*\"\t\\(\\d\\).*", '\1', ''))
566e59215c7SBram Moolenaar      break
567e59215c7SBram Moolenaar    endif
568e59215c7SBram Moolenaar  endwhile
569e59215c7SBram Moolenaar
570e59215c7SBram Moolenaar  call delete('Xviminfo')
571e59215c7SBram Moolenaar  silent! bwipe Xtestfileintab
572e59215c7SBram Moolenaarendfunc
573e11d61a3SBram Moolenaar
574156919f9SBram Moolenaarfunc Test_viminfo_file_mark_zero_time()
575156919f9SBram Moolenaar  let lines = [
576156919f9SBram Moolenaar	\ '# Viminfo version',
577156919f9SBram Moolenaar	\ '|1,4',
578156919f9SBram Moolenaar	\ '',
579156919f9SBram Moolenaar	\ '*encoding=utf-8',
580156919f9SBram Moolenaar	\ '',
581156919f9SBram Moolenaar	\ '# File marks:',
582156919f9SBram Moolenaar	\ "'B  1  0  /tmp/nothing",
583156919f9SBram Moolenaar	\ '|4,66,1,0,0,"/tmp/nothing"',
584156919f9SBram Moolenaar	\ "",
585156919f9SBram Moolenaar	\ ]
586156919f9SBram Moolenaar  call writefile(lines, 'Xviminfo')
587156919f9SBram Moolenaar  delmark B
588156919f9SBram Moolenaar  rviminfo Xviminfo
589156919f9SBram Moolenaar  call delete('Xviminfo')
590156919f9SBram Moolenaar  call assert_equal(1, line("'B"))
591156919f9SBram Moolenaar  delmark B
592156919f9SBram Moolenaarendfunc
593156919f9SBram Moolenaar
5942a8d3b89SBram Moolenaar" Test for saving and restoring file marks in unloaded buffers
5952a8d3b89SBram Moolenaarfunc Test_viminfo_file_mark_unloaded_buf()
5962a8d3b89SBram Moolenaar  let save_viminfo = &viminfo
5972a8d3b89SBram Moolenaar  set viminfo&vim
5982a8d3b89SBram Moolenaar  call writefile(repeat(['vim'], 10), 'Xfile1')
5992a8d3b89SBram Moolenaar  %bwipe
6002a8d3b89SBram Moolenaar  edit! Xfile1
6012a8d3b89SBram Moolenaar  call setpos("'u", [0, 3, 1, 0])
6022a8d3b89SBram Moolenaar  call setpos("'v", [0, 5, 1, 0])
6032a8d3b89SBram Moolenaar  enew
6042a8d3b89SBram Moolenaar  wviminfo Xviminfo
6052a8d3b89SBram Moolenaar  %bwipe
6062a8d3b89SBram Moolenaar  edit Xfile1
6072a8d3b89SBram Moolenaar  rviminfo! Xviminfo
6082a8d3b89SBram Moolenaar  call assert_equal([0, 3, 1, 0], getpos("'u"))
6092a8d3b89SBram Moolenaar  call assert_equal([0, 5, 1, 0], getpos("'v"))
6102a8d3b89SBram Moolenaar  %bwipe
6112a8d3b89SBram Moolenaar  call delete('Xfile1')
6122a8d3b89SBram Moolenaar  call delete('Xviminfo')
6132a8d3b89SBram Moolenaar  let &viminfo = save_viminfo
6142a8d3b89SBram Moolenaarendfunc
6152a8d3b89SBram Moolenaar
616156919f9SBram Moolenaarfunc Test_viminfo_oldfiles()
617e11d61a3SBram Moolenaar  let v:oldfiles = []
618e11d61a3SBram Moolenaar  let lines = [
619e11d61a3SBram Moolenaar	\ '# comment line',
620e11d61a3SBram Moolenaar	\ '*encoding=utf-8',
621e11d61a3SBram Moolenaar	\ '',
6222a8d3b89SBram Moolenaar	\ ':h viminfo',
6232a8d3b89SBram Moolenaar	\ '?/session',
6242a8d3b89SBram Moolenaar	\ '=myvar',
6252a8d3b89SBram Moolenaar	\ '@123',
6262a8d3b89SBram Moolenaar	\ '',
6272a8d3b89SBram Moolenaar	\ "'E  2  0  /tmp/nothing",
6282a8d3b89SBram Moolenaar	\ '',
629e11d61a3SBram Moolenaar	\ "> /tmp/file_one.txt",
630e11d61a3SBram Moolenaar	\ "\t\"\t11\t0",
631e11d61a3SBram Moolenaar	\ "",
632e11d61a3SBram Moolenaar	\ "> /tmp/file_two.txt",
633e11d61a3SBram Moolenaar	\ "\t\"\t11\t0",
634e11d61a3SBram Moolenaar	\ "",
635e11d61a3SBram Moolenaar	\ "> /tmp/another.txt",
636e11d61a3SBram Moolenaar	\ "\t\"\t11\t0",
637e11d61a3SBram Moolenaar	\ "",
638e11d61a3SBram Moolenaar	\ ]
639e11d61a3SBram Moolenaar  call writefile(lines, 'Xviminfo')
6402a8d3b89SBram Moolenaar  delmark E
641*5affc034SBram Moolenaar  edit /tmp/file_two.txt
642e11d61a3SBram Moolenaar  rviminfo! Xviminfo
643e11d61a3SBram Moolenaar  call delete('Xviminfo')
644e11d61a3SBram Moolenaar
6452a8d3b89SBram Moolenaar  call assert_equal('h viminfo', histget(':'))
6462a8d3b89SBram Moolenaar  call assert_equal('session', histget('/'))
6472a8d3b89SBram Moolenaar  call assert_equal('myvar', histget('='))
6482a8d3b89SBram Moolenaar  call assert_equal('123', histget('@'))
6492a8d3b89SBram Moolenaar  call assert_equal(2, line("'E"))
6507b668e83SBram Moolenaar  call assert_equal(['1: /tmp/file_one.txt', '2: /tmp/file_two.txt', '3: /tmp/another.txt'], filter(split(execute('oldfiles'), "\n"), {i, v -> v =~ '/tmp/'}))
6517b668e83SBram Moolenaar  call assert_equal(['1: /tmp/file_one.txt', '2: /tmp/file_two.txt'], filter(split(execute('filter file_ oldfiles'), "\n"), {i, v -> v =~ '/tmp/'}))
6527b668e83SBram Moolenaar  call assert_equal(['3: /tmp/another.txt'], filter(split(execute('filter /another/ oldfiles'), "\n"), {i, v -> v =~ '/tmp/'}))
6535328cb89SBram Moolenaar
6545328cb89SBram Moolenaar  new
6555328cb89SBram Moolenaar  call feedkeys("3\<CR>", 't')
6565328cb89SBram Moolenaar  browse oldfiles
6575328cb89SBram Moolenaar  call assert_equal("/tmp/another.txt", expand("%"))
6585328cb89SBram Moolenaar  bwipe
6592a8d3b89SBram Moolenaar  delmark E
6602a8d3b89SBram Moolenaarendfunc
6612a8d3b89SBram Moolenaar
6622a8d3b89SBram Moolenaar" Test for storing and restoring buffer list in 'viminfo'
6632a8d3b89SBram Moolenaarfunc Test_viminfo_bufferlist()
6642a8d3b89SBram Moolenaar  " If there are arguments, then :rviminfo doesn't read the buffer list.
6652a8d3b89SBram Moolenaar  " Need to delete all the arguments for :rviminfo to work.
6662a8d3b89SBram Moolenaar  %argdelete
6672a8d3b89SBram Moolenaar
6682a8d3b89SBram Moolenaar  edit Xfile1
6692a8d3b89SBram Moolenaar  edit Xfile2
6702a8d3b89SBram Moolenaar  set viminfo-=%
6712a8d3b89SBram Moolenaar  wviminfo Xviminfo
6722a8d3b89SBram Moolenaar  %bwipe
6732a8d3b89SBram Moolenaar  rviminfo Xviminfo
6742a8d3b89SBram Moolenaar  call assert_equal(1, len(getbufinfo()))
6752a8d3b89SBram Moolenaar
6762a8d3b89SBram Moolenaar  edit Xfile1
6772a8d3b89SBram Moolenaar  edit Xfile2
6782a8d3b89SBram Moolenaar  set viminfo^=%
6792a8d3b89SBram Moolenaar  wviminfo Xviminfo
6802a8d3b89SBram Moolenaar  %bwipe
6812a8d3b89SBram Moolenaar  rviminfo Xviminfo
6822a8d3b89SBram Moolenaar  let l = getbufinfo()
6832a8d3b89SBram Moolenaar  call assert_equal(3, len(l))
6842a8d3b89SBram Moolenaar  call assert_equal('Xfile1', bufname(l[1].bufnr))
6852a8d3b89SBram Moolenaar  call assert_equal('Xfile2', bufname(l[2].bufnr))
6862a8d3b89SBram Moolenaar
6872a8d3b89SBram Moolenaar  call delete('Xviminfo')
6882a8d3b89SBram Moolenaar  %bwipe
6892a8d3b89SBram Moolenaar  set viminfo-=%
6902a8d3b89SBram Moolenaarendfunc
6912a8d3b89SBram Moolenaar
6922a8d3b89SBram Moolenaar" Test for errors in a viminfo file
6932a8d3b89SBram Moolenaarfunc Test_viminfo_error()
6942a8d3b89SBram Moolenaar  " Non-existing viminfo files
6952a8d3b89SBram Moolenaar  call assert_fails('rviminfo xyz', 'E195:')
6962a8d3b89SBram Moolenaar
6972a8d3b89SBram Moolenaar  " Illegal starting character
6982a8d3b89SBram Moolenaar  call writefile(["a 123"], 'Xviminfo')
6992a8d3b89SBram Moolenaar  call assert_fails('rv Xviminfo', 'E575:')
7002a8d3b89SBram Moolenaar
7012a8d3b89SBram Moolenaar  " Illegal register name in the viminfo file
7022a8d3b89SBram Moolenaar  call writefile(['"@	LINE	0'], 'Xviminfo')
7032a8d3b89SBram Moolenaar  call assert_fails('rv Xviminfo', 'E577:')
7042a8d3b89SBram Moolenaar
7052a8d3b89SBram Moolenaar  " Invalid file mark line
7062a8d3b89SBram Moolenaar  call writefile(['>', '@'], 'Xviminfo')
7072a8d3b89SBram Moolenaar  call assert_fails('rv Xviminfo', 'E576:')
7082a8d3b89SBram Moolenaar
7092a8d3b89SBram Moolenaar  " Too many errors in viminfo file
7102a8d3b89SBram Moolenaar  call writefile(repeat(["a 123"], 15), 'Xviminfo')
7119b7bf9e9SBram Moolenaar  call assert_fails('rv Xviminfo', 'E575:')
7122a8d3b89SBram Moolenaar
7132a8d3b89SBram Moolenaar  call writefile(['>'] + repeat(['@'], 10), 'Xviminfo')
7149b7bf9e9SBram Moolenaar  call assert_fails('rv Xviminfo', 'E576:')
7152a8d3b89SBram Moolenaar
7162a8d3b89SBram Moolenaar  call writefile(repeat(['"@'], 15), 'Xviminfo')
7179b7bf9e9SBram Moolenaar  call assert_fails('rv Xviminfo', 'E577:')
7182a8d3b89SBram Moolenaar
7192a8d3b89SBram Moolenaar  call delete('Xviminfo')
7202a8d3b89SBram Moolenaarendfunc
7212a8d3b89SBram Moolenaar
7222a8d3b89SBram Moolenaar" Test for saving and restoring last substitute string in viminfo
7232a8d3b89SBram Moolenaarfunc Test_viminfo_lastsub()
7242a8d3b89SBram Moolenaar  enew
7252a8d3b89SBram Moolenaar  call append(0, "blue blue blue")
7262a8d3b89SBram Moolenaar  call cursor(1, 1)
7272a8d3b89SBram Moolenaar  s/blue/green/
7282a8d3b89SBram Moolenaar  wviminfo Xviminfo
7292a8d3b89SBram Moolenaar  s/blue/yellow/
7302a8d3b89SBram Moolenaar  rviminfo! Xviminfo
7312a8d3b89SBram Moolenaar  &
7322a8d3b89SBram Moolenaar  call assert_equal("green yellow green", getline(1))
7332a8d3b89SBram Moolenaar  enew!
7342a8d3b89SBram Moolenaar  call delete('Xviminfo')
7352a8d3b89SBram Moolenaarendfunc
7362a8d3b89SBram Moolenaar
7372a8d3b89SBram Moolenaar" Test saving and restoring the register values using the older method
7382a8d3b89SBram Moolenaarfunc Test_viminfo_registers_old()
7392a8d3b89SBram Moolenaar  let lines = [
7402a8d3b89SBram Moolenaar	\ '# Viminfo version',
7412a8d3b89SBram Moolenaar	\ '|1,1',
7422a8d3b89SBram Moolenaar	\ '',
7432a8d3b89SBram Moolenaar	\ '*encoding=utf-8',
7442a8d3b89SBram Moolenaar	\ '',
7452a8d3b89SBram Moolenaar	\ '# Registers:',
7462a8d3b89SBram Moolenaar	\ '""0 CHAR  0',
7472a8d3b89SBram Moolenaar	\ '	Vim',
7482a8d3b89SBram Moolenaar	\ '"a  CHAR  0',
7492a8d3b89SBram Moolenaar	\ '	red',
7502a8d3b89SBram Moolenaar	\ '"m@ CHAR  0',
7512a8d3b89SBram Moolenaar	\ "	:echo 'Hello'\<CR>",
7522a8d3b89SBram Moolenaar	\ "",
7532a8d3b89SBram Moolenaar	\ ]
7542a8d3b89SBram Moolenaar  call writefile(lines, 'Xviminfo')
7552a8d3b89SBram Moolenaar  let @a = 'one'
7562a8d3b89SBram Moolenaar  let @b = 'two'
7572a8d3b89SBram Moolenaar  let @m = 'three'
7582a8d3b89SBram Moolenaar  let @" = 'four'
7592a8d3b89SBram Moolenaar  let @t = ":echo 'Unix'\<CR>"
7602a8d3b89SBram Moolenaar  silent! normal @t
7612a8d3b89SBram Moolenaar  rviminfo! Xviminfo
7622a8d3b89SBram Moolenaar  call assert_equal('red', getreg('a'))
7632a8d3b89SBram Moolenaar  call assert_equal('two', getreg('b'))
7642a8d3b89SBram Moolenaar  call assert_equal(":echo 'Hello'\<CR>", getreg('m'))
7652a8d3b89SBram Moolenaar  call assert_equal('Vim', getreg('"'))
7662a8d3b89SBram Moolenaar  call assert_equal("\nHello", execute('normal @@'))
7672a8d3b89SBram Moolenaar  call delete('Xviminfo')
7682a8d3b89SBram Moolenaar  let @" = ''
7692a8d3b89SBram Moolenaarendfunc
7702a8d3b89SBram Moolenaar
7712a8d3b89SBram Moolenaar" Test for saving and restoring large number of lines in a register
7722a8d3b89SBram Moolenaarfunc Test_viminfo_large_register()
7732a8d3b89SBram Moolenaar  let save_viminfo = &viminfo
7742a8d3b89SBram Moolenaar  set viminfo&vim
7752a8d3b89SBram Moolenaar  set viminfo-=<50
7762a8d3b89SBram Moolenaar  set viminfo+=<200
7772a8d3b89SBram Moolenaar  let lines = ['"r	CHAR	0']
7782a8d3b89SBram Moolenaar  call extend(lines, repeat(["\tsun is rising"], 200))
7792a8d3b89SBram Moolenaar  call writefile(lines, 'Xviminfo')
7802a8d3b89SBram Moolenaar  let @r = ''
7812a8d3b89SBram Moolenaar  rviminfo! Xviminfo
7822a8d3b89SBram Moolenaar  call assert_equal(join(repeat(["sun is rising"], 200), "\n"), @r)
7832a8d3b89SBram Moolenaar  call delete('Xviminfo')
7846bd1d770SBram Moolenaar  let @r = ''
7852a8d3b89SBram Moolenaar  let &viminfo = save_viminfo
7862a8d3b89SBram Moolenaarendfunc
7872a8d3b89SBram Moolenaar
7882a8d3b89SBram Moolenaar" Test for setting 'viminfofile' to NONE
7892a8d3b89SBram Moolenaarfunc Test_viminfofile_none()
7906bd1d770SBram Moolenaar  let save_vif = &viminfofile
7912a8d3b89SBram Moolenaar  set viminfofile=NONE
7922a8d3b89SBram Moolenaar  wviminfo Xviminfo
7932a8d3b89SBram Moolenaar  call assert_false(filereadable('Xviminfo'))
7942a8d3b89SBram Moolenaar  call writefile([''], 'Xviminfo')
7952a8d3b89SBram Moolenaar  call assert_fails('rviminfo Xviminfo', 'E195:')
7962a8d3b89SBram Moolenaar  call delete('Xviminfo')
7976bd1d770SBram Moolenaar  let &viminfofile = save_vif
7982a8d3b89SBram Moolenaarendfunc
7992a8d3b89SBram Moolenaar
8006bd1d770SBram Moolenaar" Test for an unwritable and unreadble 'viminfo' file
8016bd1d770SBram Moolenaarfunc Test_viminfo_perm()
8026bd1d770SBram Moolenaar  CheckUnix
80307282f01SBram Moolenaar  CheckNotRoot
8042a8d3b89SBram Moolenaar  call writefile([''], 'Xviminfo')
8052a8d3b89SBram Moolenaar  call setfperm('Xviminfo', 'r-x------')
8062a8d3b89SBram Moolenaar  call assert_fails('wviminfo Xviminfo', 'E137:')
8076bd1d770SBram Moolenaar  call setfperm('Xviminfo', '--x------')
8086bd1d770SBram Moolenaar  call assert_fails('rviminfo Xviminfo', 'E195:')
8092a8d3b89SBram Moolenaar  call delete('Xviminfo')
810cde0ff39SBram Moolenaar
811cde0ff39SBram Moolenaar  " Try to write the viminfo to a directory
812cde0ff39SBram Moolenaar  call mkdir('Xdir')
813b86abadfSBram Moolenaar  call assert_fails('wviminfo Xdir', 'E137:')
814cde0ff39SBram Moolenaar  call delete('Xdir', 'rf')
815e11d61a3SBram Moolenaarendfunc
8166bd1d770SBram Moolenaar
8176bd1d770SBram Moolenaar" Test for writing to an existing viminfo file merges the file marks
8186bd1d770SBram Moolenaarfunc XTest_viminfo_marks_merge()
8196bd1d770SBram Moolenaar  let save_viminfo = &viminfo
8206bd1d770SBram Moolenaar  set viminfo&vim
8216bd1d770SBram Moolenaar  set viminfo^=%
8226bd1d770SBram Moolenaar  enew
8236bd1d770SBram Moolenaar  %argdelete
8246bd1d770SBram Moolenaar  %bwipe
8256bd1d770SBram Moolenaar
8266bd1d770SBram Moolenaar  call writefile(repeat(['editor'], 10), 'Xbufa')
8276bd1d770SBram Moolenaar  call writefile(repeat(['Vim'], 10), 'Xbufb')
8286bd1d770SBram Moolenaar
8296bd1d770SBram Moolenaar  " set marks in buffers
8306bd1d770SBram Moolenaar  call test_settime(10)
8316bd1d770SBram Moolenaar  edit Xbufa
8326bd1d770SBram Moolenaar  4mark a
8336bd1d770SBram Moolenaar  wviminfo Xviminfo
8346bd1d770SBram Moolenaar  edit Xbufb
8356bd1d770SBram Moolenaar  4mark b
8366bd1d770SBram Moolenaar  wviminfo Xviminfo
8376bd1d770SBram Moolenaar  %bwipe
8386bd1d770SBram Moolenaar
8396bd1d770SBram Moolenaar  " set marks in buffers again
8406bd1d770SBram Moolenaar  call test_settime(20)
8416bd1d770SBram Moolenaar  edit Xbufb
8426bd1d770SBram Moolenaar  6mark b
8436bd1d770SBram Moolenaar  wviminfo Xviminfo
8446bd1d770SBram Moolenaar  edit Xbufa
8456bd1d770SBram Moolenaar  6mark a
8466bd1d770SBram Moolenaar  wviminfo Xviminfo
8476bd1d770SBram Moolenaar  %bwipe
8486bd1d770SBram Moolenaar
8496bd1d770SBram Moolenaar  " Load the buffer and check the marks
8506bd1d770SBram Moolenaar  edit Xbufa
8516bd1d770SBram Moolenaar  rviminfo! Xviminfo
8526bd1d770SBram Moolenaar  call assert_equal(6, line("'a"))
8536bd1d770SBram Moolenaar  edit Xbufb
8546bd1d770SBram Moolenaar  rviminfo! Xviminfo
8556bd1d770SBram Moolenaar  call assert_equal(6, line("'b"))
8566bd1d770SBram Moolenaar
8576bd1d770SBram Moolenaar  " cleanup
8586bd1d770SBram Moolenaar  %bwipe
8596bd1d770SBram Moolenaar  call delete('Xviminfo')
8606bd1d770SBram Moolenaar  call delete('Xbufa')
8616bd1d770SBram Moolenaar  call delete('Xbufb')
8626bd1d770SBram Moolenaar  call test_settime(0)
8636bd1d770SBram Moolenaar  let &viminfo=save_viminfo
8646bd1d770SBram Moolenaarendfunc
865ee4e0c1eSBram Moolenaar
866ee4e0c1eSBram Moolenaar" Test for errors in setting 'viminfo'
867ee4e0c1eSBram Moolenaarfunc Test_viminfo_option_error()
868ee4e0c1eSBram Moolenaar  " Missing number
869ee4e0c1eSBram Moolenaar  call assert_fails('set viminfo=\"', 'E526:')
870ee4e0c1eSBram Moolenaar  for c in split("'/:<@s", '\zs')
871ee4e0c1eSBram Moolenaar    call assert_fails('set viminfo=' .. c, 'E526:')
872ee4e0c1eSBram Moolenaar  endfor
873ee4e0c1eSBram Moolenaar
874ee4e0c1eSBram Moolenaar  " Missing comma
875ee4e0c1eSBram Moolenaar  call assert_fails('set viminfo=%10!', 'E527:')
876ee4e0c1eSBram Moolenaar  call assert_fails('set viminfo=!%10', 'E527:')
877ee4e0c1eSBram Moolenaar  call assert_fails('set viminfo=h%10', 'E527:')
878ee4e0c1eSBram Moolenaar  call assert_fails('set viminfo=c%10', 'E527:')
879ee4e0c1eSBram Moolenaar  call assert_fails('set viminfo=:10%10', 'E527:')
880ee4e0c1eSBram Moolenaar
881ee4e0c1eSBram Moolenaar  " Missing ' setting
882ee4e0c1eSBram Moolenaar  call assert_fails('set viminfo=%10', 'E528:')
883ee4e0c1eSBram Moolenaarendfunc
884ee4e0c1eSBram Moolenaar
8858e6be343SBram Moolenaarfunc Test_viminfo_oldfiles_newfile()
8868e6be343SBram Moolenaar  CheckRunVimInTerminal
8878e6be343SBram Moolenaar
8888e6be343SBram Moolenaar  let save_viminfo = &viminfo
8898e6be343SBram Moolenaar  let save_viminfofile = &viminfofile
8908e6be343SBram Moolenaar  set viminfo&vim
8918e6be343SBram Moolenaar  let v:oldfiles = []
8928e6be343SBram Moolenaar  let commands =<< trim [CODE]
8938e6be343SBram Moolenaar    set viminfofile=Xviminfofile
8948e6be343SBram Moolenaar    set viminfo&vim
8958e6be343SBram Moolenaar    w! Xnew-file.txt
8968e6be343SBram Moolenaar    qall
8978e6be343SBram Moolenaar  [CODE]
8988e6be343SBram Moolenaar  call writefile(commands, 'Xviminfotest')
8998e6be343SBram Moolenaar  let buf = RunVimInTerminal('-S Xviminfotest', #{wait_for_ruler: 0})
9008e6be343SBram Moolenaar  call WaitForAssert({-> assert_equal("finished", term_getstatus(buf))})
9018e6be343SBram Moolenaar
9028e6be343SBram Moolenaar  let &viminfofile = 'Xviminfofile'
9038e6be343SBram Moolenaar  rviminfo! Xviminfofile
9048e6be343SBram Moolenaar  call assert_match('Xnew-file.txt$', v:oldfiles[0])
9058e6be343SBram Moolenaar  call assert_equal(1, len(v:oldfiles))
9068e6be343SBram Moolenaar  call delete('Xviminfofile')
9078e6be343SBram Moolenaar  call delete('Xviminfotest')
9088e6be343SBram Moolenaar  call delete('Xnew-file.txt')
9098e6be343SBram Moolenaar  let &viminfo = save_viminfo
9108e6be343SBram Moolenaar  let &viminfofile = save_viminfofile
9118e6be343SBram Moolenaarendfunc
9128e6be343SBram Moolenaar
913ee4e0c1eSBram Moolenaar" vim: shiftwidth=2 sts=2 expandtab
914