blob: 7db5395f3dd10caf667cd466fc5257626e435b51 [file] [log] [blame]
Bram Moolenaar48340b62017-08-29 22:08:53 +02001" Test for $HOME on Windows.
2
Bram Moolenaar39de6412019-08-08 21:52:39 +02003source check.vim
4CheckMSWindows
Bram Moolenaar48340b62017-08-29 22:08:53 +02005
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, ...)
Bram Moolenaardde60342017-08-30 14:55:42 +020040 call assert_equal(a:exp, $HOME)
41 call assert_equal(a:exp, expand('~', ':p'))
Bram Moolenaar48340b62017-08-29 22:08:53 +020042 if !a:0
43 call CheckHomeIsMissingFromSubprocessEnvironment()
44 else
Bram Moolenaardde60342017-08-30 14:55:42 +020045 call CheckHomeIsInSubprocessEnvironment(a:1)
Bram Moolenaar48340b62017-08-29 22:08:53 +020046 endif
47endfunc
48
Bram Moolenaardde60342017-08-30 14:55:42 +020049func Test_WindowsHome()
Bram Moolenaar48340b62017-08-29 22:08:53 +020050 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>)
Bram Moolenaardde60342017-08-30 14:55:42 +020053 set noshellslash
Bram Moolenaar48340b62017-08-29 22:08:53 +020054
Bram Moolenaardde60342017-08-30 14:55:42 +020055 let save_home = $HOME
56 SaveEnv $USERPROFILE $HOMEDRIVE $HOMEPATH
Bram Moolenaar48340b62017-08-29 22:08:53 +020057 try
Bram Moolenaardde60342017-08-30 14:55:42 +020058 " Normal behavior: use $HOMEDRIVE and $HOMEPATH, ignore $USERPROFILE
59 let $USERPROFILE = 'unused'
Bram Moolenaar48340b62017-08-29 22:08:53 +020060 let $HOMEDRIVE = 'C:'
61 let $HOMEPATH = '\foobar'
Bram Moolenaardde60342017-08-30 14:55:42 +020062 let $HOME = '' " Force recomputing "homedir"
Bram Moolenaar48340b62017-08-29 22:08:53 +020063 call CheckHome('C:\foobar')
64
Bram Moolenaardde60342017-08-30 14:55:42 +020065 " 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
Bram Moolenaar48340b62017-08-29 22:08:53 +020072 let $USERPROFILE = 'C:\foo'
Bram Moolenaardde60342017-08-30 14:55:42 +020073 let $HOME = '' " Force recomputing "homedir"
Bram Moolenaar48340b62017-08-29 22:08:53 +020074 call CheckHome('C:\foo')
75
Bram Moolenaardde60342017-08-30 14:55:42 +020076 " If $HOME is set the others don't matter
Bram Moolenaar48340b62017-08-29 22:08:53 +020077 let $HOME = 'C:\bar'
Bram Moolenaardde60342017-08-30 14:55:42 +020078 let $USERPROFILE = 'unused'
79 let $HOMEDRIVE = 'unused'
80 let $HOMEPATH = 'unused'
81 call CheckHome('C:\bar', 'C:\bar')
Bram Moolenaar48340b62017-08-29 22:08:53 +020082
Bram Moolenaardde60342017-08-30 14:55:42 +020083 " If $HOME contains %USERPROFILE% it is expanded
84 let $USERPROFILE = 'C:\foo'
Bram Moolenaar48340b62017-08-29 22:08:53 +020085 let $HOME = '%USERPROFILE%\bar'
Bram Moolenaardde60342017-08-30 14:55:42 +020086 let $HOMEDRIVE = 'unused'
87 let $HOMEPATH = 'unused'
88 call CheckHome('C:\foo\bar', '%USERPROFILE%\bar')
Bram Moolenaar48340b62017-08-29 22:08:53 +020089
Bram Moolenaardde60342017-08-30 14:55:42 +020090 " Invalid $HOME is kept
91 let $USERPROFILE = 'C:\foo'
Bram Moolenaar48340b62017-08-29 22:08:53 +020092 let $HOME = '%USERPROFILE'
Bram Moolenaardde60342017-08-30 14:55:42 +020093 let $HOMEDRIVE = 'unused'
94 let $HOMEPATH = 'unused'
95 call CheckHome('%USERPROFILE', '%USERPROFILE')
Bram Moolenaar48340b62017-08-29 22:08:53 +020096
Bram Moolenaardde60342017-08-30 14:55:42 +020097 " %USERPROFILE% not at start of $HOME is not expanded
98 let $USERPROFILE = 'unused'
Bram Moolenaar48340b62017-08-29 22:08:53 +020099 let $HOME = 'C:\%USERPROFILE%'
Bram Moolenaardde60342017-08-30 14:55:42 +0200100 let $HOMEDRIVE = 'unused'
101 let $HOMEPATH = 'unused'
102 call CheckHome('C:\%USERPROFILE%', 'C:\%USERPROFILE%')
Bram Moolenaar48340b62017-08-29 22:08:53 +0200103
104 if has('channel')
105 RestoreEnv
Bram Moolenaardde60342017-08-30 14:55:42 +0200106 let $HOME = save_home
Bram Moolenaar48340b62017-08-29 22:08:53 +0200107 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
Bram Moolenaar6d91bcb2020-08-12 18:50:36 +0200121
122" vim: shiftwidth=2 sts=2 expandtab