1" Tests for the writefile() function and some :write commands. 2 3source check.vim 4source term_util.vim 5 6func Test_writefile() 7 let f = tempname() 8 call writefile(["over","written"], f, "b") 9 call writefile(["hello","world"], f, "b") 10 call writefile(["!", "good"], f, "a") 11 call writefile(["morning"], f, "ab") 12 call writefile(["", "vimmers"], f, "ab") 13 let l = readfile(f) 14 call assert_equal("hello", l[0]) 15 call assert_equal("world!", l[1]) 16 call assert_equal("good", l[2]) 17 call assert_equal("morning", l[3]) 18 call assert_equal("vimmers", l[4]) 19 call delete(f) 20 21 call assert_fails('call writefile("text", "Xfile")', 'E475: Invalid argument: writefile() first argument must be a List or a Blob') 22endfunc 23 24func Test_writefile_ignore_regexp_error() 25 write Xt[z-a]est.txt 26 call delete('Xt[z-a]est.txt') 27endfunc 28 29func Test_writefile_fails_gently() 30 call assert_fails('call writefile(["test"], "Xfile", [])', 'E730:') 31 call assert_false(filereadable("Xfile")) 32 call delete("Xfile") 33 34 call assert_fails('call writefile(["test", [], [], [], "tset"], "Xfile")', 'E730:') 35 call assert_false(filereadable("Xfile")) 36 call delete("Xfile") 37 38 call assert_fails('call writefile([], "Xfile", [])', 'E730:') 39 call assert_false(filereadable("Xfile")) 40 call delete("Xfile") 41 42 call assert_fails('call writefile([], [])', 'E730:') 43endfunc 44 45func Test_writefile_fails_conversion() 46 CheckFeature iconv 47 if has('sun') 48 throw 'Skipped: does not work on SunOS' 49 endif 50 " Without a backup file the write won't happen if there is a conversion 51 " error. 52 set nobackup nowritebackup backupdir=. backupskip= 53 new 54 let contents = ["line one", "line two"] 55 call writefile(contents, 'Xfile') 56 edit Xfile 57 call setline(1, ["first line", "cannot convert \u010b", "third line"]) 58 call assert_fails('write ++enc=cp932', 'E513:') 59 call assert_equal(contents, readfile('Xfile')) 60 61 call delete('Xfile') 62 bwipe! 63 set backup& writebackup& backupdir&vim backupskip&vim 64endfunc 65 66func Test_writefile_fails_conversion2() 67 CheckFeature iconv 68 if has('sun') 69 throw 'Skipped: does not work on SunOS' 70 endif 71 " With a backup file the write happens even if there is a conversion error, 72 " but then the backup file must remain 73 set nobackup writebackup backupdir=. backupskip= 74 let contents = ["line one", "line two"] 75 call writefile(contents, 'Xfile_conversion_err') 76 edit Xfile_conversion_err 77 call setline(1, ["first line", "cannot convert \u010b", "third line"]) 78 set fileencoding=latin1 79 let output = execute('write') 80 call assert_match('CONVERSION ERROR', output) 81 call assert_equal(contents, readfile('Xfile_conversion_err~')) 82 83 call delete('Xfile_conversion_err') 84 call delete('Xfile_conversion_err~') 85 bwipe! 86 set backup& writebackup& backupdir&vim backupskip&vim 87endfunc 88 89func SetFlag(timer) 90 let g:flag = 1 91endfunc 92 93func Test_write_quit_split() 94 " Prevent exiting by splitting window on file write. 95 augroup testgroup 96 autocmd BufWritePre * split 97 augroup END 98 e! Xfile 99 call setline(1, 'nothing') 100 wq 101 102 if has('timers') 103 " timer will not run if "exiting" is still set 104 let g:flag = 0 105 call timer_start(1, 'SetFlag') 106 sleep 50m 107 call assert_equal(1, g:flag) 108 unlet g:flag 109 endif 110 au! testgroup 111 bwipe Xfile 112 call delete('Xfile') 113endfunc 114 115func Test_nowrite_quit_split() 116 " Prevent exiting by opening a help window. 117 e! Xfile 118 help 119 wincmd w 120 exe winnr() . 'q' 121 122 if has('timers') 123 " timer will not run if "exiting" is still set 124 let g:flag = 0 125 call timer_start(1, 'SetFlag') 126 sleep 50m 127 call assert_equal(1, g:flag) 128 unlet g:flag 129 endif 130 bwipe Xfile 131endfunc 132 133func Test_writefile_sync_arg() 134 " This doesn't check if fsync() works, only that the argument is accepted. 135 call writefile(['one'], 'Xtest', 's') 136 call writefile(['two'], 'Xtest', 'S') 137 call delete('Xtest') 138endfunc 139 140func Test_writefile_sync_dev_stdout() 141 CheckUnix 142 if filewritable('/dev/stdout') 143 " Just check that this doesn't cause an error. 144 call writefile(['one'], '/dev/stdout') 145 else 146 throw 'Skipped: /dev/stdout is not writable' 147 endif 148endfunc 149 150func Test_writefile_autowrite() 151 set autowrite 152 new 153 next Xa Xb Xc 154 call setline(1, 'aaa') 155 next 156 call assert_equal(['aaa'], readfile('Xa')) 157 call setline(1, 'bbb') 158 call assert_fails('edit XX') 159 call assert_false(filereadable('Xb')) 160 161 set autowriteall 162 edit XX 163 call assert_equal(['bbb'], readfile('Xb')) 164 165 bwipe! 166 call delete('Xa') 167 call delete('Xb') 168 set noautowrite 169endfunc 170 171func Test_writefile_autowrite_nowrite() 172 set autowrite 173 new 174 next Xa Xb Xc 175 set buftype=nowrite 176 call setline(1, 'aaa') 177 let buf = bufnr('%') 178 " buffer contents silently lost 179 edit XX 180 call assert_false(filereadable('Xa')) 181 rewind 182 call assert_equal('', getline(1)) 183 184 bwipe! 185 set noautowrite 186endfunc 187 188" Test for ':w !<cmd>' to pipe lines from the current buffer to an external 189" command. 190func Test_write_pipe_to_cmd() 191 CheckUnix 192 new 193 call setline(1, ['L1', 'L2', 'L3', 'L4']) 194 2,3w !cat > Xfile 195 call assert_equal(['L2', 'L3'], readfile('Xfile')) 196 close! 197 call delete('Xfile') 198endfunc 199 200" Test for :saveas 201func Test_saveas() 202 call assert_fails('saveas', 'E471:') 203 call writefile(['L1'], 'Xfile') 204 new Xfile 205 new 206 call setline(1, ['L1']) 207 call assert_fails('saveas Xfile', 'E139:') 208 close! 209 enew | only 210 call delete('Xfile') 211endfunc 212 213func Test_write_errors() 214 " Test for writing partial buffer 215 call writefile(['L1', 'L2', 'L3'], 'Xfile') 216 new Xfile 217 call assert_fails('1,2write', 'E140:') 218 close! 219 220 call assert_fails('w > Xtest', 'E494:') 221 222 " Try to overwrite a directory 223 if has('unix') 224 call mkdir('Xdir1') 225 call assert_fails('write Xdir1', 'E17:') 226 call delete('Xdir1', 'd') 227 endif 228 229 " Test for :wall for a buffer with no name 230 enew | only 231 call setline(1, ['L1']) 232 call assert_fails('wall', 'E141:') 233 enew! 234 235 " Test for writing a 'readonly' file 236 new Xfile 237 set readonly 238 call assert_fails('write', 'E45:') 239 close 240 241 " Test for writing to a read-only file 242 new Xfile 243 call setfperm('Xfile', 'r--r--r--') 244 call assert_fails('write', 'E505:') 245 call setfperm('Xfile', 'rw-rw-rw-') 246 close 247 248 call delete('Xfile') 249 250 call writefile(test_null_list(), 'Xfile') 251 call assert_false(filereadable('Xfile')) 252 call writefile(test_null_blob(), 'Xfile') 253 call assert_false(filereadable('Xfile')) 254 call assert_fails('call writefile([], "")', 'E482:') 255 256 " very long file name 257 let long_fname = repeat('n', 5000) 258 call assert_fails('exe "w " .. long_fname', 'E75:') 259 call assert_fails('call writefile([], long_fname)', 'E482:') 260endfunc 261 262" Test for writing to a file which is modified after Vim read it 263func Test_write_file_mtime() 264 CheckEnglish 265 CheckRunVimInTerminal 266 267 " First read the file into a buffer 268 call writefile(["Line1", "Line2"], 'Xfile') 269 let old_ftime = getftime('Xfile') 270 let buf = RunVimInTerminal('Xfile', #{rows : 10}) 271 call TermWait(buf) 272 call term_sendkeys(buf, ":set noswapfile\<CR>") 273 call TermWait(buf) 274 275 " Modify the file directly. Make sure the file modification time is 276 " different. Note that on Linux/Unix, the file is considered modified 277 " outside, only if the difference is 2 seconds or more 278 sleep 1 279 call writefile(["Line3", "Line4"], 'Xfile') 280 let new_ftime = getftime('Xfile') 281 while new_ftime - old_ftime < 2 282 sleep 100m 283 call writefile(["Line3", "Line4"], 'Xfile') 284 let new_ftime = getftime('Xfile') 285 endwhile 286 287 " Try to overwrite the file and check for the prompt 288 call term_sendkeys(buf, ":w\<CR>") 289 call TermWait(buf) 290 call WaitForAssert({-> assert_equal("WARNING: The file has been changed since reading it!!!", term_getline(buf, 9))}) 291 call assert_equal("Do you really want to write to it (y/n)?", 292 \ term_getline(buf, 10)) 293 call term_sendkeys(buf, "n\<CR>") 294 call TermWait(buf) 295 call assert_equal(new_ftime, getftime('Xfile')) 296 call term_sendkeys(buf, ":w\<CR>") 297 call TermWait(buf) 298 call term_sendkeys(buf, "y\<CR>") 299 call TermWait(buf) 300 call WaitForAssert({-> assert_equal('Line2', readfile('Xfile')[1])}) 301 302 " clean up 303 call StopVimInTerminal(buf) 304 call delete('Xfile') 305endfunc 306 307" Test for an autocmd unloading a buffer during a write command 308func Test_write_autocmd_unloadbuf_lockmark() 309 augroup WriteTest 310 autocmd BufWritePre Xfile enew | write 311 augroup END 312 e Xfile 313 call assert_fails('lockmarks write', ['E32:', 'E203:']) 314 augroup WriteTest 315 au! 316 augroup END 317 augroup! WriteTest 318endfunc 319 320" Test for writing a buffer with 'acwrite' but without autocmds 321func Test_write_acwrite_error() 322 new Xfile 323 call setline(1, ['line1', 'line2', 'line3']) 324 set buftype=acwrite 325 call assert_fails('write', 'E676:') 326 call assert_fails('1,2write!', 'E676:') 327 call assert_fails('w >>', 'E676:') 328 close! 329endfunc 330 331" Test for adding and removing lines from an autocmd when writing a buffer 332func Test_write_autocmd_add_remove_lines() 333 new Xfile 334 call setline(1, ['aaa', 'bbb', 'ccc', 'ddd']) 335 336 " Autocmd deleting lines from the file when writing a partial file 337 augroup WriteTest2 338 au! 339 autocmd FileWritePre Xfile 1,2d 340 augroup END 341 call assert_fails('2,3w!', 'E204:') 342 343 " Autocmd adding lines to a file when writing a partial file 344 augroup WriteTest2 345 au! 346 autocmd FileWritePre Xfile call append(0, ['xxx', 'yyy']) 347 augroup END 348 %d 349 call setline(1, ['aaa', 'bbb', 'ccc', 'ddd']) 350 1,2w! 351 call assert_equal(['xxx', 'yyy', 'aaa', 'bbb'], readfile('Xfile')) 352 353 " Autocmd deleting lines from the file when writing the whole file 354 augroup WriteTest2 355 au! 356 autocmd BufWritePre Xfile 1,2d 357 augroup END 358 %d 359 call setline(1, ['aaa', 'bbb', 'ccc', 'ddd']) 360 w 361 call assert_equal(['ccc', 'ddd'], readfile('Xfile')) 362 363 augroup WriteTest2 364 au! 365 augroup END 366 augroup! WriteTest2 367 368 close! 369 call delete('Xfile') 370endfunc 371 372" Test for writing to a readonly file 373func Test_write_readonly() 374 call writefile([], 'Xfile') 375 call setfperm('Xfile', "r--------") 376 edit Xfile 377 set noreadonly backupskip= 378 call assert_fails('write', 'E505:') 379 let save_cpo = &cpo 380 set cpo+=W 381 call assert_fails('write!', 'E504:') 382 let &cpo = save_cpo 383 call setline(1, ['line1']) 384 write! 385 call assert_equal(['line1'], readfile('Xfile')) 386 set backupskip& 387 call delete('Xfile') 388endfunc 389 390" Test for 'patchmode' 391func Test_patchmode() 392 call writefile(['one'], 'Xfile') 393 set patchmode=.orig nobackup backupskip= writebackup 394 new Xfile 395 call setline(1, 'two') 396 " first write should create the .orig file 397 write 398 call assert_equal(['one'], readfile('Xfile.orig')) 399 call setline(1, 'three') 400 " subsequent writes should not create/modify the .orig file 401 write 402 call assert_equal(['one'], readfile('Xfile.orig')) 403 set patchmode& backup& backupskip& writebackup& 404 call delete('Xfile') 405 call delete('Xfile.orig') 406endfunc 407 408" Test for writing to a file in a readonly directory 409" NOTE: if you run tests as root this will fail. Don't run tests as root! 410func Test_write_readonly_dir() 411 " On MS-Windows, modifying files in a read-only directory is allowed. 412 CheckUnix 413 call mkdir('Xdir') 414 call writefile(['one'], 'Xdir/Xfile1') 415 call setfperm('Xdir', 'r-xr--r--') 416 " try to create a new file in the directory 417 new Xdir/Xfile2 418 call setline(1, 'two') 419 call assert_fails('write', 'E212:') 420 " try to create a backup file in the directory 421 edit! Xdir/Xfile1 422 set backupdir=./Xdir backupskip= 423 set patchmode=.orig 424 call assert_fails('write', 'E509:') 425 call setfperm('Xdir', 'rwxr--r--') 426 call delete('Xdir', 'rf') 427 set backupdir& backupskip& patchmode& 428endfunc 429 430" Test for writing a file using invalid file encoding 431func Test_write_invalid_encoding() 432 new 433 call setline(1, 'abc') 434 call assert_fails('write ++enc=axbyc Xfile', 'E213:') 435 close! 436endfunc 437 438" Tests for reading and writing files with conversion for Win32. 439func Test_write_file_encoding() 440 CheckMSWindows 441 let save_encoding = &encoding 442 let save_fileencodings = &fileencodings 443 set encoding& fileencodings& 444 let text =<< trim END 445 1 utf-8 text: Для Vim version 6.2. Последнее изменение: 1970 Jan 01 446 2 cp1251 text: ��� Vim version 6.2. ��������� ���������: 1970 Jan 01 447 3 cp866 text: ��� Vim version 6.2. ������ ���������: 1970 Jan 01 448 END 449 call writefile(text, 'Xfile') 450 edit Xfile 451 452 " write tests: 453 " combine three values for 'encoding' with three values for 'fileencoding' 454 " also write files for read tests 455 call cursor(1, 1) 456 set encoding=utf-8 457 .w! ++enc=utf-8 Xtest 458 .w ++enc=cp1251 >> Xtest 459 .w ++enc=cp866 >> Xtest 460 .w! ++enc=utf-8 Xutf8 461 let expected =<< trim END 462 1 utf-8 text: Для Vim version 6.2. Последнее изменение: 1970 Jan 01 463 1 utf-8 text: ��� Vim version 6.2. ��������� ���������: 1970 Jan 01 464 1 utf-8 text: ��� Vim version 6.2. ������ ���������: 1970 Jan 01 465 END 466 call assert_equal(expected, readfile('Xtest')) 467 468 call cursor(2, 1) 469 set encoding=cp1251 470 .w! ++enc=utf-8 Xtest 471 .w ++enc=cp1251 >> Xtest 472 .w ++enc=cp866 >> Xtest 473 .w! ++enc=cp1251 Xcp1251 474 let expected =<< trim END 475 2 cp1251 text: Для Vim version 6.2. Последнее изменение: 1970 Jan 01 476 2 cp1251 text: ��� Vim version 6.2. ��������� ���������: 1970 Jan 01 477 2 cp1251 text: ��� Vim version 6.2. ������ ���������: 1970 Jan 01 478 END 479 call assert_equal(expected, readfile('Xtest')) 480 481 call cursor(3, 1) 482 set encoding=cp866 483 .w! ++enc=utf-8 Xtest 484 .w ++enc=cp1251 >> Xtest 485 .w ++enc=cp866 >> Xtest 486 .w! ++enc=cp866 Xcp866 487 let expected =<< trim END 488 3 cp866 text: Для Vim version 6.2. Последнее изменение: 1970 Jan 01 489 3 cp866 text: ��� Vim version 6.2. ��������� ���������: 1970 Jan 01 490 3 cp866 text: ��� Vim version 6.2. ������ ���������: 1970 Jan 01 491 END 492 call assert_equal(expected, readfile('Xtest')) 493 494 " read three 'fileencoding's with utf-8 'encoding' 495 set encoding=utf-8 fencs=utf-8,cp1251 496 e Xutf8 497 .w! ++enc=utf-8 Xtest 498 e Xcp1251 499 .w ++enc=utf-8 >> Xtest 500 set fencs=utf-8,cp866 501 e Xcp866 502 .w ++enc=utf-8 >> Xtest 503 let expected =<< trim END 504 1 utf-8 text: Для Vim version 6.2. Последнее изменение: 1970 Jan 01 505 2 cp1251 text: Для Vim version 6.2. Последнее изменение: 1970 Jan 01 506 3 cp866 text: Для Vim version 6.2. Последнее изменение: 1970 Jan 01 507 END 508 call assert_equal(expected, readfile('Xtest')) 509 510 " read three 'fileencoding's with cp1251 'encoding' 511 set encoding=utf-8 fencs=utf-8,cp1251 512 e Xutf8 513 .w! ++enc=cp1251 Xtest 514 e Xcp1251 515 .w ++enc=cp1251 >> Xtest 516 set fencs=utf-8,cp866 517 e Xcp866 518 .w ++enc=cp1251 >> Xtest 519 let expected =<< trim END 520 1 utf-8 text: ��� Vim version 6.2. ��������� ���������: 1970 Jan 01 521 2 cp1251 text: ��� Vim version 6.2. ��������� ���������: 1970 Jan 01 522 3 cp866 text: ��� Vim version 6.2. ��������� ���������: 1970 Jan 01 523 END 524 call assert_equal(expected, readfile('Xtest')) 525 526 " read three 'fileencoding's with cp866 'encoding' 527 set encoding=cp866 fencs=utf-8,cp1251 528 e Xutf8 529 .w! ++enc=cp866 Xtest 530 e Xcp1251 531 .w ++enc=cp866 >> Xtest 532 set fencs=utf-8,cp866 533 e Xcp866 534 .w ++enc=cp866 >> Xtest 535 let expected =<< trim END 536 1 utf-8 text: ��� Vim version 6.2. ������ ���������: 1970 Jan 01 537 2 cp1251 text: ��� Vim version 6.2. ������ ���������: 1970 Jan 01 538 3 cp866 text: ��� Vim version 6.2. ������ ���������: 1970 Jan 01 539 END 540 call assert_equal(expected, readfile('Xtest')) 541 542 call delete('Xfile') 543 call delete('Xtest') 544 call delete('Xutf8') 545 call delete('Xcp1251') 546 call delete('Xcp866') 547 let &encoding = save_encoding 548 let &fileencodings = save_fileencodings 549 %bw! 550endfunc 551 552" Test for writing and reading a file starting with a BOM. 553" Byte Order Mark (BOM) character for various encodings is below: 554" UTF-8 : EF BB BF 555" UTF-16 (BE): FE FF 556" UTF-16 (LE): FF FE 557" UTF-32 (BE): 00 00 FE FF 558" UTF-32 (LE): FF FE 00 00 559func Test_readwrite_file_with_bom() 560 let utf8_bom = "\xEF\xBB\xBF" 561 let utf16be_bom = "\xFE\xFF" 562 let utf16le_bom = "\xFF\xFE" 563 let utf32be_bom = "\n\n\xFE\xFF" 564 let utf32le_bom = "\xFF\xFE\n\n" 565 let save_fileencoding = &fileencoding 566 set cpoptions+=S 567 568 " Check that editing a latin1 file doesn't see a BOM 569 call writefile(["\xFE\xFElatin-1"], 'Xtest1') 570 edit Xtest1 571 call assert_equal('latin1', &fileencoding) 572 call assert_equal(0, &bomb) 573 set fenc=latin1 574 write Xfile2 575 call assert_equal(["\xFE\xFElatin-1", ''], readfile('Xfile2', 'b')) 576 set bomb fenc=latin1 577 write Xtest3 578 call assert_equal(["\xFE\xFElatin-1", ''], readfile('Xtest3', 'b')) 579 set bomb& 580 581 " Check utf-8 BOM 582 %bw! 583 call writefile([utf8_bom .. "utf-8"], 'Xtest1') 584 edit! Xtest1 585 call assert_equal('utf-8', &fileencoding) 586 call assert_equal(1, &bomb) 587 call assert_equal('utf-8', getline(1)) 588 set fenc=latin1 589 write! Xfile2 590 call assert_equal(['utf-8', ''], readfile('Xfile2', 'b')) 591 set fenc=utf-8 592 w! Xtest3 593 call assert_equal([utf8_bom .. "utf-8", ''], readfile('Xtest3', 'b')) 594 595 " Check utf-8 with an error (will fall back to latin-1) 596 %bw! 597 call writefile([utf8_bom .. "utf-8\x80err"], 'Xtest1') 598 edit! Xtest1 599 call assert_equal('latin1', &fileencoding) 600 call assert_equal(0, &bomb) 601 call assert_equal("\xC3\xAF\xC2\xBB\xC2\xBFutf-8\xC2\x80err", getline(1)) 602 set fenc=latin1 603 write! Xfile2 604 call assert_equal([utf8_bom .. "utf-8\x80err", ''], readfile('Xfile2', 'b')) 605 set fenc=utf-8 606 w! Xtest3 607 call assert_equal(["\xC3\xAF\xC2\xBB\xC2\xBFutf-8\xC2\x80err", ''], 608 \ readfile('Xtest3', 'b')) 609 610 " Check ucs-2 BOM 611 %bw! 612 call writefile([utf16be_bom .. "\nu\nc\ns\n-\n2\n"], 'Xtest1') 613 edit! Xtest1 614 call assert_equal('utf-16', &fileencoding) 615 call assert_equal(1, &bomb) 616 call assert_equal('ucs-2', getline(1)) 617 set fenc=latin1 618 write! Xfile2 619 call assert_equal(["ucs-2", ''], readfile('Xfile2', 'b')) 620 set fenc=ucs-2 621 w! Xtest3 622 call assert_equal([utf16be_bom .. "\nu\nc\ns\n-\n2\n", ''], 623 \ readfile('Xtest3', 'b')) 624 625 " Check ucs-2le BOM 626 %bw! 627 call writefile([utf16le_bom .. "u\nc\ns\n-\n2\nl\ne\n"], 'Xtest1') 628 " Need to add a NUL byte after the NL byte 629 call writefile(0z00, 'Xtest1', 'a') 630 edit! Xtest1 631 call assert_equal('utf-16le', &fileencoding) 632 call assert_equal(1, &bomb) 633 call assert_equal('ucs-2le', getline(1)) 634 set fenc=latin1 635 write! Xfile2 636 call assert_equal(["ucs-2le", ''], readfile('Xfile2', 'b')) 637 set fenc=ucs-2le 638 w! Xtest3 639 call assert_equal([utf16le_bom .. "u\nc\ns\n-\n2\nl\ne\n", "\n"], 640 \ readfile('Xtest3', 'b')) 641 642 " Check ucs-4 BOM 643 %bw! 644 call writefile([utf32be_bom .. "\n\n\nu\n\n\nc\n\n\ns\n\n\n-\n\n\n4\n\n\n"], 'Xtest1') 645 edit! Xtest1 646 call assert_equal('ucs-4', &fileencoding) 647 call assert_equal(1, &bomb) 648 call assert_equal('ucs-4', getline(1)) 649 set fenc=latin1 650 write! Xfile2 651 call assert_equal(["ucs-4", ''], readfile('Xfile2', 'b')) 652 set fenc=ucs-4 653 w! Xtest3 654 call assert_equal([utf32be_bom .. "\n\n\nu\n\n\nc\n\n\ns\n\n\n-\n\n\n4\n\n\n", ''], readfile('Xtest3', 'b')) 655 656 " Check ucs-4le BOM 657 %bw! 658 call writefile([utf32le_bom .. "u\n\n\nc\n\n\ns\n\n\n-\n\n\n4\n\n\nl\n\n\ne\n\n\n"], 'Xtest1') 659 " Need to add three NUL bytes after the NL byte 660 call writefile(0z000000, 'Xtest1', 'a') 661 edit! Xtest1 662 call assert_equal('ucs-4le', &fileencoding) 663 call assert_equal(1, &bomb) 664 call assert_equal('ucs-4le', getline(1)) 665 set fenc=latin1 666 write! Xfile2 667 call assert_equal(["ucs-4le", ''], readfile('Xfile2', 'b')) 668 set fenc=ucs-4le 669 w! Xtest3 670 call assert_equal([utf32le_bom .. "u\n\n\nc\n\n\ns\n\n\n-\n\n\n4\n\n\nl\n\n\ne\n\n\n", "\n\n\n"], readfile('Xtest3', 'b')) 671 672 set cpoptions-=S 673 let &fileencoding = save_fileencoding 674 call delete('Xtest1') 675 call delete('Xfile2') 676 call delete('Xtest3') 677 %bw! 678endfunc 679 680func Test_read_write_bin() 681 " write file missing EOL 682 call writefile(['noeol'], "XNoEolSetEol", 'bS') 683 call assert_equal(0z6E6F656F6C, readfile('XNoEolSetEol', 'B')) 684 685 " when file is read 'eol' is off 686 set nofixeol 687 e! ++ff=unix XNoEolSetEol 688 call assert_equal(0, &eol) 689 690 " writing with 'eol' set adds the newline 691 setlocal eol 692 w 693 call assert_equal(0z6E6F656F6C0A, readfile('XNoEolSetEol', 'B')) 694 695 call delete('XNoEolSetEol') 696 set ff& 697 bwipe! XNoEolSetEol 698endfunc 699 700" vim: shiftwidth=2 sts=2 expandtab 701