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)
diff --git a/src/testdir/test_cmdline.vim b/src/testdir/test_cmdline.vim
index 98af482..eeb9c2f 100644
--- a/src/testdir/test_cmdline.vim
+++ b/src/testdir/test_cmdline.vim
@@ -604,10 +604,20 @@
endfunc
func Test_cmdline_complete_languages()
+ let lang = substitute(execute('language time'), '.*"\(.*\)"$', '\1', '')
+ call assert_equal(lang, v:lc_time)
+
+ let lang = substitute(execute('language ctype'), '.*"\(.*\)"$', '\1', '')
+ call assert_equal(lang, v:ctype)
+
+ let lang = substitute(execute('language collate'), '.*"\(.*\)"$', '\1', '')
+ call assert_equal(lang, v:collate)
+
let lang = substitute(execute('language messages'), '.*"\(.*\)"$', '\1', '')
+ call assert_equal(lang, v:lang)
call feedkeys(":language \<c-a>\<c-b>\"\<cr>", 'tx')
- call assert_match('^"language .*\<ctype\>.*\<messages\>.*\<time\>', @:)
+ call assert_match('^"language .*\<collate\>.*\<ctype\>.*\<messages\>.*\<time\>', @:)
call assert_match('^"language .*\<' . lang . '\>', @:)
@@ -619,6 +629,9 @@
call feedkeys(":language time \<c-a>\<c-b>\"\<cr>", 'tx')
call assert_match('^"language .*\<' . lang . '\>', @:)
+
+ call feedkeys(":language collate \<c-a>\<c-b>\"\<cr>", 'tx')
+ call assert_match('^"language .*\<' . lang . '\>', @:)
endfunc
func Test_cmdline_complete_env_variable()
diff --git a/src/testdir/test_functions.vim b/src/testdir/test_functions.vim
index d9f8b9a..cefeaf7 100644
--- a/src/testdir/test_functions.vim
+++ b/src/testdir/test_functions.vim
@@ -1937,6 +1937,85 @@
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')