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