1" Test for reading and writing .viminfo 2 3function Test_read_and_write() 4 call histdel(':') 5 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 20 if line[0] == '|' && line !~ '^|[234],' 21 if done == 0 22 call assert_equal('|1,4', line) 23 elseif done == 1 24 call assert_equal('|copied as-is', line) 25 elseif done == 2 26 call assert_equal('|and one more', line) 27 endif 28 let done += 1 29 endif 30 endfor 31 call assert_equal(3, done) 32 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 42 set viminfo='100,<50,s10,h,!,nviminfo 43 wv! Xviminfo 44 unlet g:MY_GLOBAL_DICT 45 unlet g:MY_GLOBAL_LIST 46 47 rv! Xviminfo 48 call assert_equal(test_dict, g:MY_GLOBAL_DICT) 49 call assert_equal(test_list, g:MY_GLOBAL_LIST) 50 51 call delete('Xviminfo') 52 set viminfo-=! 53endfunc 54 55func Test_cmdline_history() 56 call histdel(':') 57 call test_settime(11) 58 call histadd(':', "echo 'one'") 59 call test_settime(12) 60 " split into two lines 61 let long800 = repeat(" 'eight'", 100) 62 call histadd(':', "echo " . long800) 63 call test_settime(13) 64 " split into three lines 65 let long1400 = repeat(" 'fourteeeeen'", 100) 66 call histadd(':', "echo " . long1400) 67 wviminfo Xviminfo 68 let lines = readfile('Xviminfo') 69 let done_colon = 0 70 let done_bar = 0 71 let lnum = 0 72 while lnum < len(lines) 73 let line = lines[lnum] | let lnum += 1 74 if line[0] == ':' 75 if done_colon == 0 76 call assert_equal(":\x161408", line) 77 let line = lines[lnum] | let lnum += 1 78 call assert_equal('<echo ' . long1400, line) 79 elseif done_colon == 1 80 call assert_equal(":\x16808", line) 81 let line = lines[lnum] | let lnum += 1 82 call assert_equal("<echo " . long800, line) 83 elseif done_colon == 2 84 call assert_equal(":echo 'one'", line) 85 endif 86 let done_colon += 1 87 elseif line[0:4] == '|2,0,' 88 if done_bar == 0 89 call assert_equal("|2,0,13,,>1407", line) 90 let line = lines[lnum] | let lnum += 1 91 call assert_equal('|<"echo ' . long1400[0:484], line) 92 let line = lines[lnum] | let lnum += 1 93 call assert_equal('|<' . long1400[485:974], line) 94 let line = lines[lnum] | let lnum += 1 95 call assert_equal('|<' . long1400[975:] . '"', line) 96 elseif done_bar == 1 97 call assert_equal('|2,0,12,,>807', line) 98 let line = lines[lnum] | let lnum += 1 99 call assert_equal('|<"echo ' . long800[0:484], line) 100 let line = lines[lnum] | let lnum += 1 101 call assert_equal('|<' . long800[485:] . '"', line) 102 elseif done_bar == 2 103 call assert_equal("|2,0,11,,\"echo 'one'\"", line) 104 endif 105 let done_bar += 1 106 endif 107 endwhile 108 call assert_equal(3, done_colon) 109 call assert_equal(3, done_bar) 110 111 call histdel(':') 112 rviminfo Xviminfo 113 call assert_equal("echo " . long1400, histget(':', -1)) 114 call assert_equal("echo " . long800, histget(':', -2)) 115 call assert_equal("echo 'one'", histget(':', -3)) 116 117 call delete('Xviminfo') 118endfunc 119 120func Test_cmdline_history_order() 121 call histdel(':') 122 call test_settime(11) 123 call histadd(':', "echo '11'") 124 call test_settime(22) 125 call histadd(':', "echo '22'") 126 call test_settime(33) 127 call histadd(':', "echo '33'") 128 wviminfo Xviminfo 129 130 call histdel(':') 131 " items go in between 132 call test_settime(15) 133 call histadd(':', "echo '15'") 134 call test_settime(27) 135 call histadd(':', "echo '27'") 136 137 rviminfo Xviminfo 138 call assert_equal("echo '33'", histget(':', -1)) 139 call assert_equal("echo '27'", histget(':', -2)) 140 call assert_equal("echo '22'", histget(':', -3)) 141 call assert_equal("echo '15'", histget(':', -4)) 142 call assert_equal("echo '11'", histget(':', -5)) 143 144 call histdel(':') 145 " items go before and after 146 call test_settime(8) 147 call histadd(':', "echo '8'") 148 call test_settime(39) 149 call histadd(':', "echo '39'") 150 151 rviminfo Xviminfo 152 call assert_equal("echo '39'", histget(':', -1)) 153 call assert_equal("echo '33'", histget(':', -2)) 154 call assert_equal("echo '22'", histget(':', -3)) 155 call assert_equal("echo '11'", histget(':', -4)) 156 call assert_equal("echo '8'", histget(':', -5)) 157 158 " Check sorting works when writing with merge. 159 call histdel(':') 160 call test_settime(8) 161 call histadd(':', "echo '8'") 162 call test_settime(15) 163 call histadd(':', "echo '15'") 164 call test_settime(27) 165 call histadd(':', "echo '27'") 166 call test_settime(39) 167 call histadd(':', "echo '39'") 168 wviminfo Xviminfo 169 170 call histdel(':') 171 rviminfo Xviminfo 172 call assert_equal("echo '39'", histget(':', -1)) 173 call assert_equal("echo '33'", histget(':', -2)) 174 call assert_equal("echo '27'", histget(':', -3)) 175 call assert_equal("echo '22'", histget(':', -4)) 176 call assert_equal("echo '15'", histget(':', -5)) 177 call assert_equal("echo '11'", histget(':', -6)) 178 call assert_equal("echo '8'", histget(':', -7)) 179 180 call delete('Xviminfo') 181endfunc 182 183func Test_viminfo_registers() 184 call test_settime(8) 185 call setreg('a', "eight", 'c') 186 call test_settime(20) 187 call setreg('b', ["twenty", "again"], 'l') 188 call test_settime(40) 189 call setreg('c', ["four", "agai"], 'b4') 190 let l = [] 191 set viminfo='100,<600,s10,h,!,nviminfo 192 for i in range(500) 193 call add(l, 'something') 194 endfor 195 call setreg('d', l, 'l') 196 wviminfo Xviminfo 197 198 call test_settime(10) 199 call setreg('a', '', 'b10') 200 call test_settime(15) 201 call setreg('b', 'drop') 202 call test_settime(50) 203 call setreg('c', 'keep', 'l') 204 call test_settime(30) 205 call setreg('d', 'drop', 'l') 206 rviminfo Xviminfo 207 208 call assert_equal("", getreg('a')) 209 call assert_equal("\<C-V>10", getregtype('a')) 210 call assert_equal("twenty\nagain\n", getreg('b')) 211 call assert_equal("V", getregtype('b')) 212 call assert_equal("keep\n", getreg('c')) 213 call assert_equal("V", getregtype('c')) 214 call assert_equal(l, getreg('d', 1, 1)) 215 call assert_equal("V", getregtype('d')) 216 217 call delete('Xviminfo') 218endfunc 219 220func Test_viminfo_marks() 221 sp bufa 222 let bufa = bufnr('%') 223 sp bufb 224 let bufb = bufnr('%') 225 226 call test_settime(8) 227 call setpos("'A", [bufa, 1, 1, 0]) 228 call test_settime(20) 229 call setpos("'B", [bufb, 9, 1, 0]) 230 call setpos("'C", [bufa, 7, 1, 0]) 231 232 delmark 0-9 233 call test_settime(25) 234 call setpos("'1", [bufb, 12, 1, 0]) 235 call test_settime(35) 236 call setpos("'0", [bufa, 11, 1, 0]) 237 238 call test_settime(45) 239 wviminfo Xviminfo 240 241 " Writing viminfo inserts the '0 mark. 242 call assert_equal([bufb, 1, 1, 0], getpos("'0")) 243 call assert_equal([bufa, 11, 1, 0], getpos("'1")) 244 call assert_equal([bufb, 12, 1, 0], getpos("'2")) 245 246 call test_settime(4) 247 call setpos("'A", [bufa, 9, 1, 0]) 248 call test_settime(30) 249 call setpos("'B", [bufb, 2, 3, 0]) 250 delmark C 251 252 delmark 0-9 253 call test_settime(30) 254 call setpos("'1", [bufb, 22, 1, 0]) 255 call test_settime(55) 256 call setpos("'0", [bufa, 21, 1, 0]) 257 258 rviminfo Xviminfo 259 260 call assert_equal([bufa, 1, 1, 0], getpos("'A")) 261 call assert_equal([bufb, 2, 3, 0], getpos("'B")) 262 call assert_equal([bufa, 7, 1, 0], getpos("'C")) 263 264 " numbered marks are merged 265 call assert_equal([bufa, 21, 1, 0], getpos("'0")) " time 55 266 call assert_equal([bufb, 1, 1, 0], getpos("'1")) " time 45 267 call assert_equal([bufa, 11, 1, 0], getpos("'2")) " time 35 268 call assert_equal([bufb, 22, 1, 0], getpos("'3")) " time 30 269 call assert_equal([bufb, 12, 1, 0], getpos("'4")) " time 25 270 271 call delete('Xviminfo') 272 exe 'bwipe ' . bufa 273 exe 'bwipe ' . bufb 274endfunc 275 276func Test_viminfo_jumplist() 277 split testbuf 278 clearjumps 279 call setline(1, ['time 05', 'time 10', 'time 15', 'time 20', 'time 30', 'last pos']) 280 call cursor(2, 1) 281 call test_settime(10) 282 exe "normal /20\r" 283 call test_settime(20) 284 exe "normal /30\r" 285 call test_settime(30) 286 exe "normal /last pos\r" 287 wviminfo Xviminfo 288 289 clearjumps 290 call cursor(1, 1) 291 call test_settime(5) 292 exe "normal /15\r" 293 call test_settime(15) 294 exe "normal /last pos\r" 295 call test_settime(40) 296 exe "normal ?30\r" 297 rviminfo Xviminfo 298 299 call assert_equal('time 30', getline('.')) 300 exe "normal \<C-O>" 301 call assert_equal('last pos', getline('.')) 302 exe "normal \<C-O>" 303 " duplicate for 'time 30' was removed 304 call assert_equal('time 20', getline('.')) 305 exe "normal \<C-O>" 306 call assert_equal('time 15', getline('.')) 307 exe "normal \<C-O>" 308 call assert_equal('time 10', getline('.')) 309 exe "normal \<C-O>" 310 call assert_equal('time 05', getline('.')) 311 312 clearjumps 313 call cursor(1, 1) 314 call test_settime(5) 315 exe "normal /15\r" 316 call test_settime(15) 317 exe "normal /last pos\r" 318 call test_settime(40) 319 exe "normal ?30\r" 320 " Test merge when writing 321 wviminfo Xviminfo 322 clearjumps 323 rviminfo Xviminfo 324 325 let last_line = line('.') 326 exe "normal \<C-O>" 327 call assert_equal('time 30', getline('.')) 328 exe "normal \<C-O>" 329 call assert_equal('last pos', getline('.')) 330 exe "normal \<C-O>" 331 " duplicate for 'time 30' was removed 332 call assert_equal('time 20', getline('.')) 333 exe "normal \<C-O>" 334 call assert_equal('time 15', getline('.')) 335 exe "normal \<C-O>" 336 call assert_equal('time 10', getline('.')) 337 exe "normal \<C-O>" 338 call assert_equal('time 05', getline('.')) 339 340 " Test with jumplist full. 341 clearjumps 342 call setline(1, repeat(['match here'], 101)) 343 call cursor(1, 1) 344 call test_settime(10) 345 for i in range(100) 346 exe "normal /here\r" 347 endfor 348 rviminfo Xviminfo 349 350 " must be newest mark that comes from viminfo. 351 exe "normal \<C-O>" 352 call assert_equal(last_line, line('.')) 353 354 bwipe! 355 call delete('Xviminfo') 356endfunc 357 358func Test_viminfo_encoding() 359 if !has('multi_byte') 360 return 361 endif 362 set enc=latin1 363 call histdel(':') 364 call histadd(':', "echo '\xe9'") 365 wviminfo Xviminfo 366 367 set fencs=utf-8,latin1 368 set enc=utf-8 369 sp Xviminfo 370 call assert_equal('latin1', &fenc) 371 close 372 373 call histdel(':') 374 rviminfo Xviminfo 375 call assert_equal("echo 'é'", histget(':', -1)) 376 377 call delete('Xviminfo') 378endfunc 379 380func Test_viminfo_bad_syntax() 381 let lines = [] 382 call add(lines, '|<') " empty continuation line 383 call add(lines, '|234234234234234324,nothing') 384 call add(lines, '|1+"no comma"') 385 call add(lines, '|1,2,3,4,5,6,7') " too many items 386 call add(lines, '|1,"string version"') 387 call add(lines, '|1,>x') " bad continuation line 388 call add(lines, '|1,"x') " missing quote 389 call add(lines, '|1,"x\') " trailing backslash 390 call add(lines, '|1,,,,') "trailing comma 391 call add(lines, '|1,>234') " trailing continuation line 392 call writefile(lines, 'Xviminfo') 393 rviminfo Xviminfo 394 395 call delete('Xviminfo') 396endfunc 397 398func Test_viminfo_file_marks() 399 silent! bwipe test_viminfo.vim 400 silent! bwipe Xviminfo 401 402 call test_settime(10) 403 edit ten 404 call test_settime(25) 405 edit again 406 call test_settime(30) 407 edit thirty 408 wviminfo Xviminfo 409 410 call test_settime(20) 411 edit twenty 412 call test_settime(35) 413 edit again 414 call test_settime(40) 415 edit fourty 416 wviminfo Xviminfo 417 418 sp Xviminfo 419 1 420 for name in ['fourty', 'again', 'thirty', 'twenty', 'ten'] 421 /^> 422 call assert_equal(name, substitute(getline('.'), '.*/', '', '')) 423 endfor 424 close 425 426 call delete('Xviminfo') 427endfunc 428