xref: /vim-8.2.3635/src/testdir/test_stat.vim (revision 386bc82a)
1" Tests for stat functions and checktime
2
3func CheckFileTime(doSleep)
4  let fname = 'Xtest.tmp'
5  let result = 0
6
7  let ts = localtime()
8  if a:doSleep
9    sleep 1
10  endif
11  let fl = ['Hello World!']
12  call writefile(fl, fname)
13  let tf = getftime(fname)
14  if a:doSleep
15    sleep 1
16  endif
17  let te = localtime()
18
19  let time_correct = (ts <= tf && tf <= te)
20  if a:doSleep || time_correct
21    call assert_true(time_correct)
22    call assert_equal(strlen(fl[0] . "\n"), getfsize(fname))
23    call assert_equal('file', getftype(fname))
24    call assert_equal('rw-', getfperm(fname)[0:2])
25    let result = 1
26  endif
27
28  call delete(fname)
29  return result
30endfunc
31
32func Test_existent_file()
33  " On some systems the file timestamp is rounded to a multiple of 2 seconds.
34  " We need to sleep to handle that, but that makes the test slow.  First try
35  " without the sleep, and if it fails try again with the sleep.
36  if CheckFileTime(0) == 0
37    call CheckFileTime(1)
38  endif
39endfunc
40
41func Test_existent_directory()
42  let dname = '.'
43
44  call assert_equal(0, getfsize(dname))
45  call assert_equal('dir', getftype(dname))
46  call assert_equal('rwx', getfperm(dname)[0:2])
47endfunc
48
49func SleepForTimestamp()
50  " FAT has a granularity of 2 seconds, otherwise it's usually 1 second
51  if has('win32')
52    sleep 2
53  else
54    sleep 1
55  endif
56endfunc
57
58func Test_checktime()
59  let fname = 'Xtest.tmp'
60
61  let fl = ['Hello World!']
62  call writefile(fl, fname)
63  set autoread
64  exec 'e' fname
65  call SleepForTimestamp()
66  let fl = readfile(fname)
67  let fl[0] .= ' - checktime'
68  call writefile(fl, fname)
69  checktime
70  call assert_equal(fl[0], getline(1))
71
72  call delete(fname)
73endfunc
74
75func Test_autoread_file_deleted()
76  new Xautoread
77  set autoread
78  call setline(1, 'original')
79  w!
80
81  call SleepForTimestamp()
82  if has('win32')
83    silent !echo changed > Xautoread
84  else
85    silent !echo 'changed' > Xautoread
86  endif
87  checktime
88  call assert_equal('changed', trim(getline(1)))
89
90  call SleepForTimestamp()
91  messages clear
92  if has('win32')
93    silent !del Xautoread
94  else
95    silent !rm Xautoread
96  endif
97  checktime
98  call assert_match('E211:', execute('messages'))
99  call assert_equal('changed', trim(getline(1)))
100
101  call SleepForTimestamp()
102  if has('win32')
103    silent !echo recreated > Xautoread
104  else
105    silent !echo 'recreated' > Xautoread
106  endif
107  checktime
108  call assert_equal('recreated', trim(getline(1)))
109
110  call delete('Xautoread')
111  bwipe!
112endfunc
113
114
115func Test_nonexistent_file()
116  let fname = 'Xtest.tmp'
117
118  call delete(fname)
119  call assert_equal(-1, getftime(fname))
120  call assert_equal(-1, getfsize(fname))
121  call assert_equal('', getftype(fname))
122  call assert_equal('', getfperm(fname))
123endfunc
124
125func Test_win32_symlink_dir()
126  " On Windows, non-admin users cannot create symlinks.
127  " So we use an existing symlink for this test.
128  if has('win32')
129    " Check if 'C:\Users\All Users' is a symlink to a directory.
130    let res = system('dir C:\Users /a')
131    if match(res, '\C<SYMLINKD> *All Users') >= 0
132      " Get the filetype of the symlink.
133      call assert_equal('dir', getftype('C:\Users\All Users'))
134    endif
135  endif
136endfunc
137