1" Test for $HOME on Windows. 2 3source check.vim 4CheckMSWindows 5 6let s:env = {} 7 8func s:restore_env() 9 for i in keys(s:env) 10 exe 'let ' . i . '=s:env["' . i . '"]' 11 endfor 12endfunc 13 14func s:save_env(...) 15 for i in a:000 16 exe 'let s:env["' . i . '"]=' . i 17 endfor 18endfunc 19 20func s:unlet_env(...) 21 for i in a:000 22 exe 'let ' . i . '=""' 23 endfor 24endfunc 25 26func CheckHomeIsMissingFromSubprocessEnvironment() 27 silent! let out = system('set') 28 let env = filter(split(out, "\n"), 'v:val=~"^HOME="') 29 call assert_equal(0, len(env)) 30endfunc 31 32func 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) 37endfunc 38 39func 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 47endfunc 48 49func 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 /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 120endfunc 121 122" vim: shiftwidth=2 sts=2 expandtab 123