1" Tests for the writefile() function. 2 3func Test_writefile() 4 let f = tempname() 5 call writefile(["over","written"], f, "b") 6 call writefile(["hello","world"], f, "b") 7 call writefile(["!", "good"], f, "a") 8 call writefile(["morning"], f, "ab") 9 call writefile(["", "vimmers"], f, "ab") 10 let l = readfile(f) 11 call assert_equal("hello", l[0]) 12 call assert_equal("world!", l[1]) 13 call assert_equal("good", l[2]) 14 call assert_equal("morning", l[3]) 15 call assert_equal("vimmers", l[4]) 16 call delete(f) 17endfunc 18 19func Test_writefile_fails_gently() 20 call assert_fails('call writefile(["test"], "Xfile", [])', 'E730:') 21 call assert_false(filereadable("Xfile")) 22 call delete("Xfile") 23 24 call assert_fails('call writefile(["test", [], [], [], "tset"], "Xfile")', 'E730:') 25 call assert_false(filereadable("Xfile")) 26 call delete("Xfile") 27 28 call assert_fails('call writefile([], "Xfile", [])', 'E730:') 29 call assert_false(filereadable("Xfile")) 30 call delete("Xfile") 31 32 call assert_fails('call writefile([], [])', 'E730:') 33endfunc 34 35func Test_writefile_fails_conversion() 36 if !has('multi_byte') || !has('iconv') 37 return 38 endif 39 set nobackup nowritebackup 40 new 41 let contents = ["line one", "line two"] 42 call writefile(contents, 'Xfile') 43 edit Xfile 44 call setline(1, ["first line", "cannot convert \u010b", "third line"]) 45 call assert_fails('write ++enc=cp932') 46 call assert_equal(contents, readfile('Xfile')) 47 48 call delete('Xfile') 49 bwipe! 50 set backup& writebackup& 51endfunc 52 53func SetFlag(timer) 54 let g:flag = 1 55endfunc 56 57func Test_write_quit_split() 58 " Prevent exiting by splitting window on file write. 59 augroup testgroup 60 autocmd BufWritePre * split 61 augroup END 62 e! Xfile 63 call setline(1, 'nothing') 64 wq 65 66 if has('timers') 67 " timer will not run if "exiting" is still set 68 let g:flag = 0 69 call timer_start(1, 'SetFlag') 70 sleep 50m 71 call assert_equal(1, g:flag) 72 unlet g:flag 73 endif 74 au! testgroup 75 bwipe Xfile 76 call delete('Xfile') 77endfunc 78 79func Test_nowrite_quit_split() 80 " Prevent exiting by opening a help window. 81 e! Xfile 82 help 83 wincmd w 84 exe winnr() . 'q' 85 86 if has('timers') 87 " timer will not run if "exiting" is still set 88 let g:flag = 0 89 call timer_start(1, 'SetFlag') 90 sleep 50m 91 call assert_equal(1, g:flag) 92 unlet g:flag 93 endif 94 bwipe Xfile 95endfunc 96 97func Test_writefile_sync_arg() 98 " This doesn't check if fsync() works, only that the argument is accepted. 99 call writefile(['one'], 'Xtest', 's') 100 call writefile(['two'], 'Xtest', 'S') 101 call delete('Xtest') 102endfunc 103 104func Test_writefile_sync_dev_stdout() 105 if !has('unix') 106 return 107 endif 108 if filewritable('/dev/stdout') 109 " Just check that this doesn't cause an error. 110 call writefile(['one'], '/dev/stdout') 111 else 112 throw 'Skipped: /dev/stdout is not writable' 113 endif 114endfunc 115