Mercurial > vim
view src/testdir/test_stat.vim @ 15001:9401618259e9
Added tag v8.1.0511 for changeset 32787e326de2eef4bda654219135d31162513bdf
author | Bram Moolenaar <Bram@vim.org> |
---|---|
date | Sun, 04 Nov 2018 23:45:07 +0100 |
parents | 40b10f98eb13 |
children | c7628d6bc0dc |
line wrap: on
line source
" Tests for stat functions and checktime func CheckFileTime(doSleep) let fname = 'Xtest.tmp' let result = 0 let ts = localtime() if a:doSleep sleep 1 endif let fl = ['Hello World!'] call writefile(fl, fname) let tf = getftime(fname) if a:doSleep sleep 1 endif let te = localtime() let time_correct = (ts <= tf && tf <= te) if a:doSleep || time_correct call assert_true(time_correct) call assert_equal(strlen(fl[0] . "\n"), getfsize(fname)) call assert_equal('file', getftype(fname)) call assert_equal('rw-', getfperm(fname)[0:2]) let result = 1 endif call delete(fname) return result endfunc func Test_existent_file() " On some systems the file timestamp is rounded to a multiple of 2 seconds. " We need to sleep to handle that, but that makes the test slow. First try " without the sleep, and if it fails try again with the sleep. if CheckFileTime(0) == 0 call CheckFileTime(1) endif endfunc func Test_existent_directory() let dname = '.' call assert_equal(0, getfsize(dname)) call assert_equal('dir', getftype(dname)) call assert_equal('rwx', getfperm(dname)[0:2]) endfunc func SleepForTimestamp() " FAT has a granularity of 2 seconds, otherwise it's usually 1 second if has('win32') sleep 2 else sleep 1 endif endfunc func Test_checktime() let fname = 'Xtest.tmp' let fl = ['Hello World!'] call writefile(fl, fname) set autoread exec 'e' fname call SleepForTimestamp() let fl = readfile(fname) let fl[0] .= ' - checktime' call writefile(fl, fname) checktime call assert_equal(fl[0], getline(1)) call delete(fname) endfunc func Test_autoread_file_deleted() new Xautoread set autoread call setline(1, 'original') w! call SleepForTimestamp() if has('win32') silent !echo changed > Xautoread else silent !echo 'changed' > Xautoread endif checktime call assert_equal('changed', trim(getline(1))) call SleepForTimestamp() messages clear if has('win32') silent !del Xautoread else silent !rm Xautoread endif checktime call assert_match('E211:', execute('messages')) call assert_equal('changed', trim(getline(1))) call SleepForTimestamp() if has('win32') silent !echo recreated > Xautoread else silent !echo 'recreated' > Xautoread endif checktime call assert_equal('recreated', trim(getline(1))) call delete('Xautoread') bwipe! endfunc func Test_nonexistent_file() let fname = 'Xtest.tmp' call delete(fname) call assert_equal(-1, getftime(fname)) call assert_equal(-1, getfsize(fname)) call assert_equal('', getftype(fname)) call assert_equal('', getfperm(fname)) endfunc func Test_getftype() call assert_equal('file', getftype(v:progpath)) call assert_equal('dir', getftype('.')) if !has('unix') return endif silent !ln -s Xfile Xlink call assert_equal('link', getftype('Xlink')) call delete('Xlink') if executable('mkfifo') silent !mkfifo Xfifo call assert_equal('fifo', getftype('Xfifo')) call delete('Xfifo') endif for cdevfile in systemlist('find /dev -type c -maxdepth 2 2>/dev/null') let type = getftype(cdevfile) " ignore empty result, can happen if the file disappeared if type != '' call assert_equal('cdev', type) endif endfor for bdevfile in systemlist('find /dev -type b -maxdepth 2 2>/dev/null') let type = getftype(bdevfile) " ignore empty result, can happen if the file disappeared if type != '' call assert_equal('bdev', type) endif endfor " The /run/ directory typically contains socket files. " If it does not, test won't fail but will not test socket files. for socketfile in systemlist('find /run -type s -maxdepth 2 2>/dev/null') let type = getftype(socketfile) " ignore empty result, can happen if the file disappeared if type != '' call assert_equal('socket', type) endif endfor " TODO: file type 'other' is not tested. How can we test it? endfunc func Test_win32_symlink_dir() " On Windows, non-admin users cannot create symlinks. " So we use an existing symlink for this test. if has('win32') " Check if 'C:\Users\All Users' is a symlink to a directory. let res = system('dir C:\Users /a') if match(res, '\C<SYMLINKD> *All Users') >= 0 " Get the filetype of the symlink. call assert_equal('dir', getftype('C:\Users\All Users')) endif endif endfunc