0
0
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:
Bram Moolenaar
2020-06-16 20:03:43 +02:00
parent 9af78769ee
commit 84cf6bd81b
17 changed files with 272 additions and 32 deletions

View File

@@ -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')