neovim

Neovim text editor
git clone https://git.dasho.dev/neovim.git
Log | Files | Refs | README

test_windows_home.vim (3252B)


      1 " Test for $HOME on Windows.
      2 
      3 source check.vim
      4 CheckMSWindows
      5 
      6 let s:env = {}
      7 
      8 func s:restore_env()
      9  for i in keys(s:env)
     10    exe 'let ' . i . '=s:env["' . i . '"]'
     11  endfor
     12 endfunc
     13 
     14 func s:save_env(...)
     15  for i in a:000
     16    exe 'let s:env["' . i . '"]=' . i
     17  endfor
     18 endfunc
     19 
     20 func s:unlet_env(...)
     21  for i in a:000
     22    exe 'let ' . i . '=""'
     23  endfor
     24 endfunc
     25 
     26 func CheckHomeIsMissingFromSubprocessEnvironment()
     27  silent! let out = system('set')
     28  let env = filter(split(out, "\n"), 'v:val=~"^HOME="')
     29  call assert_equal(0, len(env))
     30 endfunc
     31 
     32 func CheckHomeIsInSubprocessEnvironment(exp)
     33  silent! let out = system('set')
     34  let env = filter(split(out, "\n"), 'v:val=~"^HOME="')
     35  let home = len(env) == 0 ? "" : substitute(env[0], '[^=]\+=', '', '')
     36  call assert_equal(a:exp, home)
     37 endfunc
     38 
     39 func CheckHome(exp, ...)
     40  call assert_equal(a:exp, $HOME)
     41  call assert_equal(a:exp, expand('~', ':p'))
     42  if !a:0
     43    call CheckHomeIsMissingFromSubprocessEnvironment()
     44  else
     45    call CheckHomeIsInSubprocessEnvironment(a:1)
     46  endif
     47 endfunc
     48 
     49 func Test_WindowsHome()
     50  command! -nargs=* SaveEnv call <SID>save_env(<f-args>)
     51  command! -nargs=* RestoreEnv call <SID>restore_env()
     52  command! -nargs=* UnletEnv call <SID>unlet_env(<f-args>)
     53  set noshellslash
     54 
     55  let save_home = $HOME
     56  SaveEnv $USERPROFILE $HOMEDRIVE $HOMEPATH
     57  try
     58    " Normal behavior: use $HOMEDRIVE and $HOMEPATH, ignore $USERPROFILE
     59    let $USERPROFILE = 'unused'
     60    let $HOMEDRIVE = 'C:'
     61    let $HOMEPATH = '\foobar'
     62    let $HOME = ''  " Force recomputing "homedir"
     63    call CheckHome('C:\foobar')
     64 
     65    " Same, but with $HOMEPATH not set
     66    UnletEnv $HOMEPATH
     67    let $HOME = ''  " Force recomputing "homedir"
     68    call CheckHome('C:\')
     69 
     70    " Use $USERPROFILE if $HOMEPATH and $HOMEDRIVE are empty
     71    UnletEnv $HOMEDRIVE $HOMEPATH
     72    let $USERPROFILE = 'C:\foo'
     73    let $HOME = ''  " Force recomputing "homedir"
     74    call CheckHome('C:\foo')
     75 
     76    " If $HOME is set the others don't matter
     77    let $HOME = 'C:\bar'
     78    let $USERPROFILE = 'unused'
     79    let $HOMEDRIVE = 'unused'
     80    let $HOMEPATH = 'unused'
     81    call CheckHome('C:\bar', 'C:\bar')
     82 
     83    " If $HOME contains %USERPROFILE% it is expanded
     84    let $USERPROFILE = 'C:\foo'
     85    let $HOME = '%USERPROFILE%\bar'
     86    let $HOMEDRIVE = 'unused'
     87    let $HOMEPATH = 'unused'
     88    call CheckHome('C:\foo\bar', '%USERPROFILE%\bar')
     89 
     90    " Invalid $HOME is kept
     91    let $USERPROFILE = 'C:\foo'
     92    let $HOME = '%USERPROFILE'
     93    let $HOMEDRIVE = 'unused'
     94    let $HOMEPATH = 'unused'
     95    call CheckHome('%USERPROFILE', '%USERPROFILE')
     96 
     97    " %USERPROFILE% not at start of $HOME is not expanded
     98    let $USERPROFILE = 'unused'
     99    let $HOME = 'C:\%USERPROFILE%'
    100    let $HOMEDRIVE = 'unused'
    101    let $HOMEPATH = 'unused'
    102    call CheckHome('C:\%USERPROFILE%', 'C:\%USERPROFILE%')
    103 
    104    if has('channel')
    105      RestoreEnv
    106      let $HOME = save_home
    107      let env = ''
    108      let job = job_start('cmd /D /c set', {'out_cb': {ch,x->[env,execute('let env=x')]}})
    109      sleep 1
    110      let env = filter(split(env, "\n"), 'v:val=="HOME"')
    111      let home = len(env) == 0 ? "" : env[0]
    112      call assert_equal('', home)
    113    endif
    114  finally
    115    RestoreEnv
    116    delcommand SaveEnv
    117    delcommand RestoreEnv
    118    delcommand UnletEnv
    119  endtry
    120 endfunc