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') || system('uname -s') =~ 'SunOS'
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
116func Test_writefile_autowrite()
117  set autowrite
118  new
119  next Xa Xb Xc
120  call setline(1, 'aaa')
121  next
122  call assert_equal(['aaa'], readfile('Xa'))
123  call setline(1, 'bbb')
124  call assert_fails('edit XX')
125  call assert_false(filereadable('Xb'))
126
127  set autowriteall
128  edit XX
129  call assert_equal(['bbb'], readfile('Xb'))
130
131  bwipe!
132  call delete('Xa')
133  call delete('Xb')
134  set noautowrite
135endfunc
136
137func Test_writefile_autowrite_nowrite()
138  set autowrite
139  new
140  next Xa Xb Xc
141  set buftype=nowrite
142  call setline(1, 'aaa')
143  let buf = bufnr('%')
144  " buffer contents silently lost
145  edit XX
146  call assert_false(filereadable('Xa'))
147  rewind
148  call assert_equal('', getline(1))
149
150  bwipe!
151  set noautowrite
152endfunc
153