blob: cea78e574808171be4ffc5728a7afc122a274cc8 [file] [log] [blame]
Bram Moolenaarb20e3342016-01-18 23:29:01 +01001" Test for reading and writing .viminfo
2
Bram Moolenaar156919f2016-10-15 20:46:20 +02003function Test_viminfo_read_and_write()
Bram Moolenaar45d2eea2016-06-06 21:07:52 +02004 call histdel(':')
Bram Moolenaarb20e3342016-01-18 23:29:01 +01005 let lines = [
6 \ '# comment line',
7 \ '*encoding=utf-8',
8 \ '~MSle0~/asdf',
9 \ '|copied as-is',
10 \ '|and one more',
11 \ ]
12 call writefile(lines, 'Xviminfo')
13 rviminfo Xviminfo
14 call assert_equal('asdf', @/)
15
16 wviminfo Xviminfo
17 let lines = readfile('Xviminfo')
18 let done = 0
19 for line in lines
Bram Moolenaar156919f2016-10-15 20:46:20 +020020 if line[0] == '|' && line !~ '^|[234],' && line !~ '^|<'
Bram Moolenaarb20e3342016-01-18 23:29:01 +010021 if done == 0
Bram Moolenaar2d358992016-06-12 21:20:54 +020022 call assert_equal('|1,4', line)
Bram Moolenaarb20e3342016-01-18 23:29:01 +010023 elseif done == 1
Bram Moolenaar45d2eea2016-06-06 21:07:52 +020024 call assert_equal('|copied as-is', line)
25 elseif done == 2
Bram Moolenaarb20e3342016-01-18 23:29:01 +010026 call assert_equal('|and one more', line)
27 endif
28 let done += 1
29 endif
30 endfor
Bram Moolenaar45d2eea2016-06-06 21:07:52 +020031 call assert_equal(3, done)
Bram Moolenaarb20e3342016-01-18 23:29:01 +010032
33 call delete('Xviminfo')
34endfunc
35
36func Test_global_vars()
37 let test_dict = {'foo': 1, 'bar': 0, 'longvarible': 1000}
38 let g:MY_GLOBAL_DICT = test_dict
39 " store a really long list, so line wrapping will occur in viminfo file
40 let test_list = range(1,100)
41 let g:MY_GLOBAL_LIST = test_list
Bram Moolenaar8c8b8bb2019-01-13 17:48:04 +010042 let test_blob = 0z00112233445566778899aabbccddeeff
43 let g:MY_GLOBAL_BLOB = test_blob
44 let test_false = v:false
45 let g:MY_GLOBAL_FALSE = test_false
46 let test_true = v:true
47 let g:MY_GLOBAL_TRUE = test_true
48 let test_null = v:null
49 let g:MY_GLOBAL_NULL = test_null
50 let test_none = v:none
51 let g:MY_GLOBAL_NONE = test_none
52
Bram Moolenaare9c07272016-03-30 20:50:46 +020053 set viminfo='100,<50,s10,h,!,nviminfo
Bram Moolenaarb20e3342016-01-18 23:29:01 +010054 wv! Xviminfo
Bram Moolenaar8c8b8bb2019-01-13 17:48:04 +010055
Bram Moolenaarb20e3342016-01-18 23:29:01 +010056 unlet g:MY_GLOBAL_DICT
57 unlet g:MY_GLOBAL_LIST
Bram Moolenaar8c8b8bb2019-01-13 17:48:04 +010058 unlet g:MY_GLOBAL_BLOB
59 unlet g:MY_GLOBAL_FALSE
60 unlet g:MY_GLOBAL_TRUE
61 unlet g:MY_GLOBAL_NULL
62 unlet g:MY_GLOBAL_NONE
Bram Moolenaarb20e3342016-01-18 23:29:01 +010063
64 rv! Xviminfo
65 call assert_equal(test_dict, g:MY_GLOBAL_DICT)
66 call assert_equal(test_list, g:MY_GLOBAL_LIST)
Bram Moolenaar8c8b8bb2019-01-13 17:48:04 +010067 call assert_equal(test_blob, g:MY_GLOBAL_BLOB)
68 call assert_equal(test_false, g:MY_GLOBAL_FALSE)
69 call assert_equal(test_true, g:MY_GLOBAL_TRUE)
70 call assert_equal(test_null, g:MY_GLOBAL_NULL)
71 call assert_equal(test_none, g:MY_GLOBAL_NONE)
Bram Moolenaarb20e3342016-01-18 23:29:01 +010072
73 call delete('Xviminfo')
74 set viminfo-=!
75endfunc
Bram Moolenaar45d2eea2016-06-06 21:07:52 +020076
77func Test_cmdline_history()
78 call histdel(':')
79 call test_settime(11)
80 call histadd(':', "echo 'one'")
81 call test_settime(12)
82 " split into two lines
83 let long800 = repeat(" 'eight'", 100)
84 call histadd(':', "echo " . long800)
85 call test_settime(13)
86 " split into three lines
87 let long1400 = repeat(" 'fourteeeeen'", 100)
88 call histadd(':', "echo " . long1400)
89 wviminfo Xviminfo
90 let lines = readfile('Xviminfo')
91 let done_colon = 0
92 let done_bar = 0
93 let lnum = 0
94 while lnum < len(lines)
95 let line = lines[lnum] | let lnum += 1
96 if line[0] == ':'
97 if done_colon == 0
98 call assert_equal(":\x161408", line)
99 let line = lines[lnum] | let lnum += 1
100 call assert_equal('<echo ' . long1400, line)
101 elseif done_colon == 1
102 call assert_equal(":\x16808", line)
103 let line = lines[lnum] | let lnum += 1
104 call assert_equal("<echo " . long800, line)
105 elseif done_colon == 2
106 call assert_equal(":echo 'one'", line)
107 endif
108 let done_colon += 1
109 elseif line[0:4] == '|2,0,'
110 if done_bar == 0
111 call assert_equal("|2,0,13,,>1407", line)
112 let line = lines[lnum] | let lnum += 1
113 call assert_equal('|<"echo ' . long1400[0:484], line)
114 let line = lines[lnum] | let lnum += 1
115 call assert_equal('|<' . long1400[485:974], line)
116 let line = lines[lnum] | let lnum += 1
117 call assert_equal('|<' . long1400[975:] . '"', line)
118 elseif done_bar == 1
119 call assert_equal('|2,0,12,,>807', line)
120 let line = lines[lnum] | let lnum += 1
121 call assert_equal('|<"echo ' . long800[0:484], line)
122 let line = lines[lnum] | let lnum += 1
123 call assert_equal('|<' . long800[485:] . '"', line)
124 elseif done_bar == 2
125 call assert_equal("|2,0,11,,\"echo 'one'\"", line)
126 endif
127 let done_bar += 1
128 endif
129 endwhile
130 call assert_equal(3, done_colon)
131 call assert_equal(3, done_bar)
132
133 call histdel(':')
134 rviminfo Xviminfo
135 call assert_equal("echo " . long1400, histget(':', -1))
136 call assert_equal("echo " . long800, histget(':', -2))
137 call assert_equal("echo 'one'", histget(':', -3))
138
139 call delete('Xviminfo')
140endfunc
Bram Moolenaar1fd99c12016-06-09 20:24:28 +0200141
142func Test_cmdline_history_order()
143 call histdel(':')
144 call test_settime(11)
145 call histadd(':', "echo '11'")
146 call test_settime(22)
147 call histadd(':', "echo '22'")
148 call test_settime(33)
149 call histadd(':', "echo '33'")
150 wviminfo Xviminfo
151
152 call histdel(':')
153 " items go in between
154 call test_settime(15)
155 call histadd(':', "echo '15'")
156 call test_settime(27)
157 call histadd(':', "echo '27'")
158
159 rviminfo Xviminfo
160 call assert_equal("echo '33'", histget(':', -1))
161 call assert_equal("echo '27'", histget(':', -2))
162 call assert_equal("echo '22'", histget(':', -3))
163 call assert_equal("echo '15'", histget(':', -4))
164 call assert_equal("echo '11'", histget(':', -5))
165
166 call histdel(':')
167 " items go before and after
168 call test_settime(8)
169 call histadd(':', "echo '8'")
170 call test_settime(39)
171 call histadd(':', "echo '39'")
172
173 rviminfo Xviminfo
174 call assert_equal("echo '39'", histget(':', -1))
175 call assert_equal("echo '33'", histget(':', -2))
176 call assert_equal("echo '22'", histget(':', -3))
177 call assert_equal("echo '11'", histget(':', -4))
178 call assert_equal("echo '8'", histget(':', -5))
179
180 " Check sorting works when writing with merge.
181 call histdel(':')
182 call test_settime(8)
183 call histadd(':', "echo '8'")
184 call test_settime(15)
185 call histadd(':', "echo '15'")
186 call test_settime(27)
187 call histadd(':', "echo '27'")
188 call test_settime(39)
189 call histadd(':', "echo '39'")
190 wviminfo Xviminfo
191
192 call histdel(':')
193 rviminfo Xviminfo
194 call assert_equal("echo '39'", histget(':', -1))
195 call assert_equal("echo '33'", histget(':', -2))
196 call assert_equal("echo '27'", histget(':', -3))
197 call assert_equal("echo '22'", histget(':', -4))
198 call assert_equal("echo '15'", histget(':', -5))
199 call assert_equal("echo '11'", histget(':', -6))
200 call assert_equal("echo '8'", histget(':', -7))
201
202 call delete('Xviminfo')
203endfunc
Bram Moolenaar01227092016-06-11 14:47:40 +0200204
Bram Moolenaare80ff742016-06-11 21:14:18 +0200205func Test_viminfo_registers()
206 call test_settime(8)
207 call setreg('a', "eight", 'c')
208 call test_settime(20)
209 call setreg('b', ["twenty", "again"], 'l')
210 call test_settime(40)
211 call setreg('c', ["four", "agai"], 'b4')
212 let l = []
213 set viminfo='100,<600,s10,h,!,nviminfo
214 for i in range(500)
215 call add(l, 'something')
216 endfor
217 call setreg('d', l, 'l')
218 wviminfo Xviminfo
219
220 call test_settime(10)
221 call setreg('a', '', 'b10')
222 call test_settime(15)
223 call setreg('b', 'drop')
224 call test_settime(50)
225 call setreg('c', 'keep', 'l')
226 call test_settime(30)
227 call setreg('d', 'drop', 'l')
228 rviminfo Xviminfo
229
230 call assert_equal("", getreg('a'))
231 call assert_equal("\<C-V>10", getregtype('a'))
232 call assert_equal("twenty\nagain\n", getreg('b'))
233 call assert_equal("V", getregtype('b'))
234 call assert_equal("keep\n", getreg('c'))
235 call assert_equal("V", getregtype('c'))
236 call assert_equal(l, getreg('d', 1, 1))
237 call assert_equal("V", getregtype('d'))
238
Bram Moolenaar25709572016-08-26 20:41:16 +0200239 " Length around 440 switches to line continuation.
240 let len = 434
241 while len < 445
242 let s = repeat('a', len)
243 call setreg('"', s)
244 wviminfo Xviminfo
245 call setreg('"', '')
246 rviminfo Xviminfo
247 call assert_equal(s, getreg('"'), 'wrong register at length: ' . len)
248
249 let len += 1
250 endwhile
251
Bram Moolenaare80ff742016-06-11 21:14:18 +0200252 call delete('Xviminfo')
253endfunc
254
Bram Moolenaar2d358992016-06-12 21:20:54 +0200255func Test_viminfo_marks()
256 sp bufa
257 let bufa = bufnr('%')
258 sp bufb
259 let bufb = bufnr('%')
260
261 call test_settime(8)
262 call setpos("'A", [bufa, 1, 1, 0])
263 call test_settime(20)
264 call setpos("'B", [bufb, 9, 1, 0])
265 call setpos("'C", [bufa, 7, 1, 0])
266
267 delmark 0-9
268 call test_settime(25)
269 call setpos("'1", [bufb, 12, 1, 0])
270 call test_settime(35)
271 call setpos("'0", [bufa, 11, 1, 0])
272
273 call test_settime(45)
274 wviminfo Xviminfo
275
276 " Writing viminfo inserts the '0 mark.
277 call assert_equal([bufb, 1, 1, 0], getpos("'0"))
278 call assert_equal([bufa, 11, 1, 0], getpos("'1"))
279 call assert_equal([bufb, 12, 1, 0], getpos("'2"))
280
281 call test_settime(4)
282 call setpos("'A", [bufa, 9, 1, 0])
283 call test_settime(30)
284 call setpos("'B", [bufb, 2, 3, 0])
285 delmark C
286
287 delmark 0-9
288 call test_settime(30)
289 call setpos("'1", [bufb, 22, 1, 0])
290 call test_settime(55)
291 call setpos("'0", [bufa, 21, 1, 0])
292
293 rviminfo Xviminfo
294
295 call assert_equal([bufa, 1, 1, 0], getpos("'A"))
296 call assert_equal([bufb, 2, 3, 0], getpos("'B"))
297 call assert_equal([bufa, 7, 1, 0], getpos("'C"))
298
299 " numbered marks are merged
300 call assert_equal([bufa, 21, 1, 0], getpos("'0")) " time 55
301 call assert_equal([bufb, 1, 1, 0], getpos("'1")) " time 45
302 call assert_equal([bufa, 11, 1, 0], getpos("'2")) " time 35
303 call assert_equal([bufb, 22, 1, 0], getpos("'3")) " time 30
304 call assert_equal([bufb, 12, 1, 0], getpos("'4")) " time 25
305
306 call delete('Xviminfo')
307 exe 'bwipe ' . bufa
308 exe 'bwipe ' . bufb
309endfunc
310
311func Test_viminfo_jumplist()
312 split testbuf
313 clearjumps
314 call setline(1, ['time 05', 'time 10', 'time 15', 'time 20', 'time 30', 'last pos'])
315 call cursor(2, 1)
316 call test_settime(10)
317 exe "normal /20\r"
318 call test_settime(20)
319 exe "normal /30\r"
320 call test_settime(30)
321 exe "normal /last pos\r"
322 wviminfo Xviminfo
323
324 clearjumps
325 call cursor(1, 1)
326 call test_settime(5)
327 exe "normal /15\r"
328 call test_settime(15)
329 exe "normal /last pos\r"
330 call test_settime(40)
331 exe "normal ?30\r"
332 rviminfo Xviminfo
333
334 call assert_equal('time 30', getline('.'))
335 exe "normal \<C-O>"
336 call assert_equal('last pos', getline('.'))
337 exe "normal \<C-O>"
338 " duplicate for 'time 30' was removed
339 call assert_equal('time 20', getline('.'))
340 exe "normal \<C-O>"
341 call assert_equal('time 15', getline('.'))
342 exe "normal \<C-O>"
343 call assert_equal('time 10', getline('.'))
344 exe "normal \<C-O>"
345 call assert_equal('time 05', getline('.'))
346
Bram Moolenaarece74ab2016-06-13 22:22:15 +0200347 clearjumps
348 call cursor(1, 1)
349 call test_settime(5)
350 exe "normal /15\r"
351 call test_settime(15)
352 exe "normal /last pos\r"
353 call test_settime(40)
354 exe "normal ?30\r"
355 " Test merge when writing
356 wviminfo Xviminfo
357 clearjumps
358 rviminfo Xviminfo
359
Bram Moolenaar28607ba2016-06-15 21:44:51 +0200360 let last_line = line('.')
Bram Moolenaarece74ab2016-06-13 22:22:15 +0200361 exe "normal \<C-O>"
362 call assert_equal('time 30', getline('.'))
363 exe "normal \<C-O>"
364 call assert_equal('last pos', getline('.'))
365 exe "normal \<C-O>"
366 " duplicate for 'time 30' was removed
367 call assert_equal('time 20', getline('.'))
368 exe "normal \<C-O>"
369 call assert_equal('time 15', getline('.'))
370 exe "normal \<C-O>"
371 call assert_equal('time 10', getline('.'))
372 exe "normal \<C-O>"
373 call assert_equal('time 05', getline('.'))
374
Bram Moolenaar28607ba2016-06-15 21:44:51 +0200375 " Test with jumplist full.
376 clearjumps
377 call setline(1, repeat(['match here'], 101))
378 call cursor(1, 1)
379 call test_settime(10)
380 for i in range(100)
381 exe "normal /here\r"
382 endfor
383 rviminfo Xviminfo
384
385 " must be newest mark that comes from viminfo.
386 exe "normal \<C-O>"
387 call assert_equal(last_line, line('.'))
388
Bram Moolenaar2d358992016-06-12 21:20:54 +0200389 bwipe!
390 call delete('Xviminfo')
391endfunc
392
Bram Moolenaar01227092016-06-11 14:47:40 +0200393func Test_viminfo_encoding()
Bram Moolenaar01227092016-06-11 14:47:40 +0200394 set enc=latin1
395 call histdel(':')
396 call histadd(':', "echo '\xe9'")
397 wviminfo Xviminfo
398
399 set fencs=utf-8,latin1
400 set enc=utf-8
401 sp Xviminfo
402 call assert_equal('latin1', &fenc)
403 close
404
405 call histdel(':')
406 rviminfo Xviminfo
407 call assert_equal("echo 'é'", histget(':', -1))
408
409 call delete('Xviminfo')
410endfunc
Bram Moolenaar62f8b4e2016-06-11 15:31:47 +0200411
412func Test_viminfo_bad_syntax()
413 let lines = []
414 call add(lines, '|<') " empty continuation line
415 call add(lines, '|234234234234234324,nothing')
416 call add(lines, '|1+"no comma"')
417 call add(lines, '|1,2,3,4,5,6,7') " too many items
418 call add(lines, '|1,"string version"')
419 call add(lines, '|1,>x') " bad continuation line
420 call add(lines, '|1,"x') " missing quote
421 call add(lines, '|1,"x\') " trailing backslash
422 call add(lines, '|1,,,,') "trailing comma
423 call add(lines, '|1,>234') " trailing continuation line
424 call writefile(lines, 'Xviminfo')
Bram Moolenaare80ff742016-06-11 21:14:18 +0200425 rviminfo Xviminfo
Bram Moolenaar62f8b4e2016-06-11 15:31:47 +0200426
427 call delete('Xviminfo')
428endfunc
429
Bram Moolenaarab9c89b2016-07-03 17:47:26 +0200430func Test_viminfo_file_marks()
431 silent! bwipe test_viminfo.vim
432 silent! bwipe Xviminfo
433
434 call test_settime(10)
435 edit ten
436 call test_settime(25)
437 edit again
438 call test_settime(30)
439 edit thirty
440 wviminfo Xviminfo
441
442 call test_settime(20)
443 edit twenty
444 call test_settime(35)
445 edit again
446 call test_settime(40)
447 edit fourty
448 wviminfo Xviminfo
449
450 sp Xviminfo
451 1
452 for name in ['fourty', 'again', 'thirty', 'twenty', 'ten']
453 /^>
454 call assert_equal(name, substitute(getline('.'), '.*/', '', ''))
455 endfor
456 close
457
458 call delete('Xviminfo')
459endfunc
Bram Moolenaare59215c2016-08-14 19:08:45 +0200460
461func Test_viminfo_file_mark_tabclose()
462 tabnew Xtestfileintab
463 call setline(1, ['a','b','c','d','e'])
464 4
465 q!
466 wviminfo Xviminfo
467 sp Xviminfo
468 /^> .*Xtestfileintab
469 let lnum = line('.')
470 while 1
471 if lnum == line('$')
Bram Moolenaar37175402017-03-18 20:18:45 +0100472 call assert_report('mark not found in Xtestfileintab')
Bram Moolenaare59215c2016-08-14 19:08:45 +0200473 break
474 endif
475 let lnum += 1
476 let line = getline(lnum)
477 if line == ''
Bram Moolenaar37175402017-03-18 20:18:45 +0100478 call assert_report('mark not found in Xtestfileintab')
Bram Moolenaare59215c2016-08-14 19:08:45 +0200479 break
480 endif
481 if line =~ "^\t\""
482 call assert_equal('4', substitute(line, ".*\"\t\\(\\d\\).*", '\1', ''))
483 break
484 endif
485 endwhile
486
487 call delete('Xviminfo')
488 silent! bwipe Xtestfileintab
489endfunc
Bram Moolenaare11d61a2016-08-20 18:36:54 +0200490
Bram Moolenaar156919f2016-10-15 20:46:20 +0200491func Test_viminfo_file_mark_zero_time()
492 let lines = [
493 \ '# Viminfo version',
494 \ '|1,4',
495 \ '',
496 \ '*encoding=utf-8',
497 \ '',
498 \ '# File marks:',
499 \ "'B 1 0 /tmp/nothing",
500 \ '|4,66,1,0,0,"/tmp/nothing"',
501 \ "",
502 \ ]
503 call writefile(lines, 'Xviminfo')
504 delmark B
505 rviminfo Xviminfo
506 call delete('Xviminfo')
507 call assert_equal(1, line("'B"))
508 delmark B
509endfunc
510
511func Test_viminfo_oldfiles()
Bram Moolenaare11d61a2016-08-20 18:36:54 +0200512 let v:oldfiles = []
513 let lines = [
514 \ '# comment line',
515 \ '*encoding=utf-8',
516 \ '',
517 \ "> /tmp/file_one.txt",
518 \ "\t\"\t11\t0",
519 \ "",
520 \ "> /tmp/file_two.txt",
521 \ "\t\"\t11\t0",
522 \ "",
523 \ "> /tmp/another.txt",
524 \ "\t\"\t11\t0",
525 \ "",
526 \ ]
527 call writefile(lines, 'Xviminfo')
528 rviminfo! Xviminfo
529 call delete('Xviminfo')
530
Bram Moolenaar7b668e82016-08-23 23:51:21 +0200531 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/'}))
532 call assert_equal(['1: /tmp/file_one.txt', '2: /tmp/file_two.txt'], filter(split(execute('filter file_ oldfiles'), "\n"), {i, v -> v =~ '/tmp/'}))
533 call assert_equal(['3: /tmp/another.txt'], filter(split(execute('filter /another/ oldfiles'), "\n"), {i, v -> v =~ '/tmp/'}))
Bram Moolenaare11d61a2016-08-20 18:36:54 +0200534endfunc