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  " Root can do it too.
414  CheckNotRoot
415
416  call mkdir('Xdir')
417  call writefile(['one'], 'Xdir/Xfile1')
418  call setfperm('Xdir', 'r-xr--r--')
419  " try to create a new file in the directory
420  new Xdir/Xfile2
421  call setline(1, 'two')
422  call assert_fails('write', 'E212:')
423  " try to create a backup file in the directory
424  edit! Xdir/Xfile1
425  set backupdir=./Xdir backupskip=
426  set patchmode=.orig
427  call assert_fails('write', 'E509:')
428  call setfperm('Xdir', 'rwxr--r--')
429  call delete('Xdir', 'rf')
430  set backupdir& backupskip& patchmode&
431endfunc
432
433" Test for writing a file using invalid file encoding
434func Test_write_invalid_encoding()
435  new
436  call setline(1, 'abc')
437  call assert_fails('write ++enc=axbyc Xfile', 'E213:')
438  close!
439endfunc
440
441" Tests for reading and writing files with conversion for Win32.
442func Test_write_file_encoding()
443  CheckMSWindows
444  let save_encoding = &encoding
445  let save_fileencodings = &fileencodings
446  set encoding& fileencodings&
447  let text =<< trim END
448    1 utf-8 text: Для Vim version 6.2.  Последнее изменение: 1970 Jan 01
449    2 cp1251 text: ��� Vim version 6.2.  ��������� ���������: 1970 Jan 01
450    3 cp866 text: ��� Vim version 6.2.  ��᫥���� ���������: 1970 Jan 01
451  END
452  call writefile(text, 'Xfile')
453  edit Xfile
454
455  " write tests:
456  " combine three values for 'encoding' with three values for 'fileencoding'
457  " also write files for read tests
458  call cursor(1, 1)
459  set encoding=utf-8
460  .w! ++enc=utf-8 Xtest
461  .w ++enc=cp1251 >> Xtest
462  .w ++enc=cp866 >> Xtest
463  .w! ++enc=utf-8 Xutf8
464  let expected =<< trim END
465    1 utf-8 text: Для Vim version 6.2.  Последнее изменение: 1970 Jan 01
466    1 utf-8 text: ��� Vim version 6.2.  ��������� ���������: 1970 Jan 01
467    1 utf-8 text: ��� Vim version 6.2.  ��᫥���� ���������: 1970 Jan 01
468  END
469  call assert_equal(expected, readfile('Xtest'))
470
471  call cursor(2, 1)
472  set encoding=cp1251
473  .w! ++enc=utf-8 Xtest
474  .w ++enc=cp1251 >> Xtest
475  .w ++enc=cp866 >> Xtest
476  .w! ++enc=cp1251 Xcp1251
477  let expected =<< trim END
478    2 cp1251 text: Для Vim version 6.2.  Последнее изменение: 1970 Jan 01
479    2 cp1251 text: ��� Vim version 6.2.  ��������� ���������: 1970 Jan 01
480    2 cp1251 text: ��� Vim version 6.2.  ��᫥���� ���������: 1970 Jan 01
481  END
482  call assert_equal(expected, readfile('Xtest'))
483
484  call cursor(3, 1)
485  set encoding=cp866
486  .w! ++enc=utf-8 Xtest
487  .w ++enc=cp1251 >> Xtest
488  .w ++enc=cp866 >> Xtest
489  .w! ++enc=cp866 Xcp866
490  let expected =<< trim END
491    3 cp866 text: Для Vim version 6.2.  Последнее изменение: 1970 Jan 01
492    3 cp866 text: ��� Vim version 6.2.  ��������� ���������: 1970 Jan 01
493    3 cp866 text: ��� Vim version 6.2.  ��᫥���� ���������: 1970 Jan 01
494  END
495  call assert_equal(expected, readfile('Xtest'))
496
497  " read three 'fileencoding's with utf-8 'encoding'
498  set encoding=utf-8 fencs=utf-8,cp1251
499  e Xutf8
500  .w! ++enc=utf-8 Xtest
501  e Xcp1251
502  .w ++enc=utf-8 >> Xtest
503  set fencs=utf-8,cp866
504  e Xcp866
505  .w ++enc=utf-8 >> Xtest
506  let expected =<< trim END
507    1 utf-8 text: Для Vim version 6.2.  Последнее изменение: 1970 Jan 01
508    2 cp1251 text: Для Vim version 6.2.  Последнее изменение: 1970 Jan 01
509    3 cp866 text: Для Vim version 6.2.  Последнее изменение: 1970 Jan 01
510  END
511  call assert_equal(expected, readfile('Xtest'))
512
513  " read three 'fileencoding's with cp1251 'encoding'
514  set encoding=utf-8 fencs=utf-8,cp1251
515  e Xutf8
516  .w! ++enc=cp1251 Xtest
517  e Xcp1251
518  .w ++enc=cp1251 >> Xtest
519  set fencs=utf-8,cp866
520  e Xcp866
521  .w ++enc=cp1251 >> Xtest
522  let expected =<< trim END
523    1 utf-8 text: ��� Vim version 6.2.  ��������� ���������: 1970 Jan 01
524    2 cp1251 text: ��� Vim version 6.2.  ��������� ���������: 1970 Jan 01
525    3 cp866 text: ��� Vim version 6.2.  ��������� ���������: 1970 Jan 01
526  END
527  call assert_equal(expected, readfile('Xtest'))
528
529  " read three 'fileencoding's with cp866 'encoding'
530  set encoding=cp866 fencs=utf-8,cp1251
531  e Xutf8
532  .w! ++enc=cp866 Xtest
533  e Xcp1251
534  .w ++enc=cp866 >> Xtest
535  set fencs=utf-8,cp866
536  e Xcp866
537  .w ++enc=cp866 >> Xtest
538  let expected =<< trim END
539    1 utf-8 text: ��� Vim version 6.2.  ��᫥���� ���������: 1970 Jan 01
540    2 cp1251 text: ��� Vim version 6.2.  ��᫥���� ���������: 1970 Jan 01
541    3 cp866 text: ��� Vim version 6.2.  ��᫥���� ���������: 1970 Jan 01
542  END
543  call assert_equal(expected, readfile('Xtest'))
544
545  call delete('Xfile')
546  call delete('Xtest')
547  call delete('Xutf8')
548  call delete('Xcp1251')
549  call delete('Xcp866')
550  let &encoding = save_encoding
551  let &fileencodings = save_fileencodings
552  %bw!
553endfunc
554
555" Test for writing and reading a file starting with a BOM.
556" Byte Order Mark (BOM) character for various encodings is below:
557"     UTF-8      : EF BB BF
558"     UTF-16 (BE): FE FF
559"     UTF-16 (LE): FF FE
560"     UTF-32 (BE): 00 00 FE FF
561"     UTF-32 (LE): FF FE 00 00
562func Test_readwrite_file_with_bom()
563  let utf8_bom = "\xEF\xBB\xBF"
564  let utf16be_bom = "\xFE\xFF"
565  let utf16le_bom = "\xFF\xFE"
566  let utf32be_bom = "\n\n\xFE\xFF"
567  let utf32le_bom = "\xFF\xFE\n\n"
568  let save_fileencoding = &fileencoding
569  set cpoptions+=S
570
571  " Check that editing a latin1 file doesn't see a BOM
572  call writefile(["\xFE\xFElatin-1"], 'Xtest1')
573  edit Xtest1
574  call assert_equal('latin1', &fileencoding)
575  call assert_equal(0, &bomb)
576  set fenc=latin1
577  write Xfile2
578  call assert_equal(["\xFE\xFElatin-1", ''], readfile('Xfile2', 'b'))
579  set bomb fenc=latin1
580  write Xtest3
581  call assert_equal(["\xFE\xFElatin-1", ''], readfile('Xtest3', 'b'))
582  set bomb&
583
584  " Check utf-8 BOM
585  %bw!
586  call writefile([utf8_bom .. "utf-8"], 'Xtest1')
587  edit! Xtest1
588  call assert_equal('utf-8', &fileencoding)
589  call assert_equal(1, &bomb)
590  call assert_equal('utf-8', getline(1))
591  set fenc=latin1
592  write! Xfile2
593  call assert_equal(['utf-8', ''], readfile('Xfile2', 'b'))
594  set fenc=utf-8
595  w! Xtest3
596  call assert_equal([utf8_bom .. "utf-8", ''], readfile('Xtest3', 'b'))
597
598  " Check utf-8 with an error (will fall back to latin-1)
599  %bw!
600  call writefile([utf8_bom .. "utf-8\x80err"], 'Xtest1')
601  edit! Xtest1
602  call assert_equal('latin1', &fileencoding)
603  call assert_equal(0, &bomb)
604  call assert_equal("\xC3\xAF\xC2\xBB\xC2\xBFutf-8\xC2\x80err", getline(1))
605  set fenc=latin1
606  write! Xfile2
607  call assert_equal([utf8_bom .. "utf-8\x80err", ''], readfile('Xfile2', 'b'))
608  set fenc=utf-8
609  w! Xtest3
610  call assert_equal(["\xC3\xAF\xC2\xBB\xC2\xBFutf-8\xC2\x80err", ''],
611        \ readfile('Xtest3', 'b'))
612
613  " Check ucs-2 BOM
614  %bw!
615  call writefile([utf16be_bom .. "\nu\nc\ns\n-\n2\n"], 'Xtest1')
616  edit! Xtest1
617  call assert_equal('utf-16', &fileencoding)
618  call assert_equal(1, &bomb)
619  call assert_equal('ucs-2', getline(1))
620  set fenc=latin1
621  write! Xfile2
622  call assert_equal(["ucs-2", ''], readfile('Xfile2', 'b'))
623  set fenc=ucs-2
624  w! Xtest3
625  call assert_equal([utf16be_bom .. "\nu\nc\ns\n-\n2\n", ''],
626        \ readfile('Xtest3', 'b'))
627
628  " Check ucs-2le BOM
629  %bw!
630  call writefile([utf16le_bom .. "u\nc\ns\n-\n2\nl\ne\n"], 'Xtest1')
631  " Need to add a NUL byte after the NL byte
632  call writefile(0z00, 'Xtest1', 'a')
633  edit! Xtest1
634  call assert_equal('utf-16le', &fileencoding)
635  call assert_equal(1, &bomb)
636  call assert_equal('ucs-2le', getline(1))
637  set fenc=latin1
638  write! Xfile2
639  call assert_equal(["ucs-2le", ''], readfile('Xfile2', 'b'))
640  set fenc=ucs-2le
641  w! Xtest3
642  call assert_equal([utf16le_bom .. "u\nc\ns\n-\n2\nl\ne\n", "\n"],
643        \ readfile('Xtest3', 'b'))
644
645  " Check ucs-4 BOM
646  %bw!
647  call writefile([utf32be_bom .. "\n\n\nu\n\n\nc\n\n\ns\n\n\n-\n\n\n4\n\n\n"], 'Xtest1')
648  edit! Xtest1
649  call assert_equal('ucs-4', &fileencoding)
650  call assert_equal(1, &bomb)
651  call assert_equal('ucs-4', getline(1))
652  set fenc=latin1
653  write! Xfile2
654  call assert_equal(["ucs-4", ''], readfile('Xfile2', 'b'))
655  set fenc=ucs-4
656  w! Xtest3
657  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'))
658
659  " Check ucs-4le BOM
660  %bw!
661  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')
662  " Need to add three NUL bytes after the NL byte
663  call writefile(0z000000, 'Xtest1', 'a')
664  edit! Xtest1
665  call assert_equal('ucs-4le', &fileencoding)
666  call assert_equal(1, &bomb)
667  call assert_equal('ucs-4le', getline(1))
668  set fenc=latin1
669  write! Xfile2
670  call assert_equal(["ucs-4le", ''], readfile('Xfile2', 'b'))
671  set fenc=ucs-4le
672  w! Xtest3
673  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'))
674
675  set cpoptions-=S
676  let &fileencoding = save_fileencoding
677  call delete('Xtest1')
678  call delete('Xfile2')
679  call delete('Xtest3')
680  %bw!
681endfunc
682
683func Test_read_write_bin()
684  " write file missing EOL
685  call writefile(['noeol'], "XNoEolSetEol", 'bS')
686  call assert_equal(0z6E6F656F6C, readfile('XNoEolSetEol', 'B'))
687
688  " when file is read 'eol' is off
689  set nofixeol
690  e! ++ff=unix XNoEolSetEol
691  call assert_equal(0, &eol)
692
693  " writing with 'eol' set adds the newline
694  setlocal eol
695  w
696  call assert_equal(0z6E6F656F6C0A, readfile('XNoEolSetEol', 'B'))
697
698  call delete('XNoEolSetEol')
699  set ff&
700  bwipe! XNoEolSetEol
701endfunc
702
703" vim: shiftwidth=2 sts=2 expandtab
704