mirror of
https://github.com/vim/vim.git
synced 2025-09-26 04:04:07 -04:00
patch 8.2.0988: getting directory contents is always case sorted
Problem: Getting directory contents is always case sorted. Solution: Add sort options and v:collate. (Christian Brabandt, closes #6229)
This commit is contained in:
@@ -1937,6 +1937,85 @@ func Test_readdirex()
|
||||
eval 'Xdir'->delete('rf')
|
||||
endfunc
|
||||
|
||||
func Test_readdirex_sort()
|
||||
CheckUnix
|
||||
" Skip tests on Mac OS X and Cygwin (does not allow several files with different casing)
|
||||
if has("osxdarwin") || has("osx") || has("macunix") || has("win32unix")
|
||||
throw 'Skipped: Test_readdirex_sort on systems that do not allow this using the default filesystem'
|
||||
endif
|
||||
let _collate = v:collate
|
||||
call mkdir('Xdir2')
|
||||
call writefile(['1'], 'Xdir2/README.txt')
|
||||
call writefile(['2'], 'Xdir2/Readme.txt')
|
||||
call writefile(['3'], 'Xdir2/readme.txt')
|
||||
|
||||
" 1) default
|
||||
let files = readdirex('Xdir2')->map({-> v:val.name})
|
||||
let default = copy(files)
|
||||
call assert_equal(['README.txt', 'Readme.txt', 'readme.txt'], files, 'sort using default')
|
||||
|
||||
" 2) no sorting
|
||||
let files = readdirex('Xdir2', 1, #{sort: 'none'})->map({-> v:val.name})
|
||||
let unsorted = copy(files)
|
||||
call assert_equal(['README.txt', 'Readme.txt', 'readme.txt'], sort(files), 'unsorted')
|
||||
|
||||
" 3) sort by case (same as default)
|
||||
let files = readdirex('Xdir2', 1, #{sort: 'case'})->map({-> v:val.name})
|
||||
call assert_equal(default, files, 'sort by case')
|
||||
|
||||
" 4) sort by ignoring case
|
||||
let files = readdirex('Xdir2', 1, #{sort: 'icase'})->map({-> v:val.name})
|
||||
call assert_equal(unsorted->sort('i'), files, 'sort by icase')
|
||||
|
||||
" 5) Default Collation
|
||||
let collate = v:collate
|
||||
lang collate C
|
||||
let files = readdirex('Xdir2', 1, #{sort: 'collate'})->map({-> v:val.name})
|
||||
call assert_equal(['README.txt', 'Readme.txt', 'readme.txt'], files, 'sort by C collation')
|
||||
|
||||
" 6) Collation de_DE
|
||||
" Switch locale, this may not work on the CI system, if the locale isn't
|
||||
" available
|
||||
try
|
||||
lang collate de_DE
|
||||
let files = readdirex('Xdir2', 1, #{sort: 'collate'})->map({-> v:val.name})
|
||||
call assert_equal(['readme.txt', 'Readme.txt', 'README.txt'], files, 'sort by de_DE collation')
|
||||
catch
|
||||
throw 'Skipped: de_DE collation is not available'
|
||||
|
||||
finally
|
||||
exe 'lang collate' collate
|
||||
eval 'Xdir2'->delete('rf')
|
||||
endtry
|
||||
endfunc
|
||||
|
||||
func Test_readdir_sort()
|
||||
" some more cases for testing sorting for readdirex
|
||||
let dir = 'Xdir3'
|
||||
call mkdir(dir)
|
||||
call writefile(['1'], dir .. '/README.txt')
|
||||
call writefile(['2'], dir .. '/Readm.txt')
|
||||
call writefile(['3'], dir .. '/read.txt')
|
||||
call writefile(['4'], dir .. '/Z.txt')
|
||||
call writefile(['5'], dir .. '/a.txt')
|
||||
call writefile(['6'], dir .. '/b.txt')
|
||||
|
||||
" 1) default
|
||||
let files = readdir(dir)
|
||||
let default = copy(files)
|
||||
call assert_equal(default->sort(), files, 'sort using default')
|
||||
|
||||
" 2) sort by case (same as default)
|
||||
let files = readdir(dir, '1', #{sort: 'case'})
|
||||
call assert_equal(default, files, 'sort using default')
|
||||
|
||||
" 3) sort by ignoring case
|
||||
let files = readdir(dir, '1', #{sort: 'icase'})
|
||||
call assert_equal(default->sort('i'), files, 'sort by ignoring case')
|
||||
|
||||
eval dir->delete('rf')
|
||||
endfunc
|
||||
|
||||
func Test_delete_rf()
|
||||
call mkdir('Xdir')
|
||||
call writefile([], 'Xdir/foo.txt')
|
||||
|
Reference in New Issue
Block a user