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