blob: 76f6692aea1b1a434d966a836b76f0ca45cc1c9e [file] [log] [blame]
Bram Moolenaar07282f02019-10-10 16:46:17 +02001source shared.vim
Bram Moolenaar3180fe62020-02-02 13:47:06 +01002source term_util.vim
Bram Moolenaar07282f02019-10-10 16:46:17 +02003
Bram Moolenaar7f829ca2020-01-31 22:12:41 +01004command -nargs=1 MissingFeature throw 'Skipped: ' .. <args> .. ' feature missing'
5
Bram Moolenaarb46fecd2019-06-15 17:58:09 +02006" Command to check for the presence of a feature.
7command -nargs=1 CheckFeature call CheckFeature(<f-args>)
8func CheckFeature(name)
Bram Moolenaar79296512020-03-22 16:17:14 +01009 if !has(a:name, 1)
10 throw 'Checking for non-existent feature ' .. a:name
11 endif
Bram Moolenaarb46fecd2019-06-15 17:58:09 +020012 if !has(a:name)
Bram Moolenaar7f829ca2020-01-31 22:12:41 +010013 MissingFeature a:name
Bram Moolenaarb46fecd2019-06-15 17:58:09 +020014 endif
15endfunc
16
Bram Moolenaarfb773a32021-07-03 21:37:59 +020017" Command to check for the absence of a feature.
18command -nargs=1 CheckNotFeature call CheckNotFeature(<f-args>)
19func CheckNotFeature(name)
20 if !has(a:name, 1)
21 throw 'Checking for non-existent feature ' .. a:name
22 endif
23 if has(a:name)
24 throw 'Skipped: ' .. a:name .. ' feature present'
25 endif
26endfunc
27
Bram Moolenaarb46fecd2019-06-15 17:58:09 +020028" Command to check for the presence of a working option.
29command -nargs=1 CheckOption call CheckOption(<f-args>)
30func CheckOption(name)
Bram Moolenaarc5a8fdc2020-03-22 20:13:39 +010031 if !exists('&' .. a:name)
32 throw 'Checking for non-existent option ' .. a:name
33 endif
Bram Moolenaarb46fecd2019-06-15 17:58:09 +020034 if !exists('+' .. a:name)
35 throw 'Skipped: ' .. a:name .. ' option not supported'
36 endif
37endfunc
38
Bram Moolenaar15c47602020-03-26 22:16:48 +010039" Command to check for the presence of a built-in function.
Bram Moolenaarb46fecd2019-06-15 17:58:09 +020040command -nargs=1 CheckFunction call CheckFunction(<f-args>)
41func CheckFunction(name)
Bram Moolenaar15c47602020-03-26 22:16:48 +010042 if !exists('?' .. a:name)
43 throw 'Checking for non-existent function ' .. a:name
44 endif
Bram Moolenaarb46fecd2019-06-15 17:58:09 +020045 if !exists('*' .. a:name)
46 throw 'Skipped: ' .. a:name .. ' function missing'
47 endif
48endfunc
Bram Moolenaar4641a122019-07-29 22:10:23 +020049
Bram Moolenaar8c5a2782019-08-07 23:07:07 +020050" Command to check for the presence of an Ex command
51command -nargs=1 CheckCommand call CheckCommand(<f-args>)
52func CheckCommand(name)
53 if !exists(':' .. a:name)
54 throw 'Skipped: ' .. a:name .. ' command not supported'
55 endif
56endfunc
57
58" Command to check for the presence of a shell command
59command -nargs=1 CheckExecutable call CheckExecutable(<f-args>)
60func CheckExecutable(name)
61 if !executable(a:name)
62 throw 'Skipped: ' .. a:name .. ' program not executable'
63 endif
64endfunc
65
Bram Moolenaara161cb52020-04-30 19:09:35 +020066" Command to check for the presence of python. Argument should have been
67" obtained with PythonProg()
68func CheckPython(name)
69 if a:name == ''
70 throw 'Skipped: python command not available'
71 endif
72endfunc
73
Bram Moolenaar4641a122019-07-29 22:10:23 +020074" Command to check for running on MS-Windows
75command CheckMSWindows call CheckMSWindows()
76func CheckMSWindows()
77 if !has('win32')
78 throw 'Skipped: only works on MS-Windows'
79 endif
80endfunc
81
Bram Moolenaar8c5a2782019-08-07 23:07:07 +020082" Command to check for NOT running on MS-Windows
83command CheckNotMSWindows call CheckNotMSWindows()
84func CheckNotMSWindows()
85 if has('win32')
86 throw 'Skipped: does not work on MS-Windows'
87 endif
88endfunc
89
Bram Moolenaar4641a122019-07-29 22:10:23 +020090" Command to check for running on Unix
91command CheckUnix call CheckUnix()
92func CheckUnix()
93 if !has('unix')
94 throw 'Skipped: only works on Unix'
95 endif
96endfunc
Bram Moolenaar3c8ee622019-08-03 22:55:50 +020097
LemonBoycc766a82022-04-04 15:46:58 +010098" Command to check for running on Linux
Bram Moolenaar6635ae12021-03-10 21:46:39 +010099command CheckLinux call CheckLinux()
100func CheckLinux()
101 if !has('linux')
102 throw 'Skipped: only works on Linux'
103 endif
104endfunc
105
Bram Moolenaar8b9abfd2021-03-29 20:49:05 +0200106" Command to check for not running on a BSD system.
107command CheckNotBSD call CheckNotBSD()
108func CheckNotBSD()
109 if has('bsd')
110 throw 'Skipped: does not work on BSD'
111 endif
112endfunc
113
Bram Moolenaarf8027672022-09-27 15:55:43 +0100114" Command to check for not running on a MacOS
115command CheckNotMac call CheckNotMac()
116func CheckNotMac()
117 if has('mac')
118 throw 'Skipped: does not work on MacOS'
119 endif
120endfunc
121
Bram Moolenaar0056ca72022-09-23 21:26:39 +0100122" Command to check for not running on a MacOS M1 system.
123command CheckNotMacM1 call CheckNotMacM1()
124func CheckNotMacM1()
125 if has('mac') && system('uname -a') =~ '\<arm64\>'
126 throw 'Skipped: does not work on MacOS M1'
127 endif
128endfunc
129
Drew Vogelea67ba72025-05-07 22:05:17 +0200130func SetupWindowSizeToForVisualDumps()
131 " The dumps used as reference in these tests were created with a terminal
132 " width of 75 columns. The vim window that uses the remainder of the GUI
133 " window width must be at least 3 columns. In theory this means we need the
134 " GUI shell to provide 78+ columns. However the GTK3 resize logic is flaky,
135 " sometimes resulting in X11 Configure events that are narrower than
136 " expected by a number of pixels equal to 2 column widths. Therefore
137 " setting 80 columns ensures that the GUI shell can still provide 78+
138 " columns. This is very likely papering over a GTK3 resize bug but one that
139 " has existed for a very long time. Establishing this workaround is meant to
140 " get the GTK3 code working under CI so that we can focus on removing this
141 " over the long term.
142 if &columns != 80
143 set columns=80
144 endif
145 " Without resetting lines, some GTK3 resize events can carry over between
146 " tests, which invalidate assumptions in the scrollbar offset calculations.
147 if &lines != 25
148 set lines=25
149 endif
150endfunc
151
Bram Moolenaar3c8ee622019-08-03 22:55:50 +0200152" Command to check that making screendumps is supported.
153" Caller must source screendump.vim
154command CheckScreendump call CheckScreendump()
155func CheckScreendump()
Drew Vogelea67ba72025-05-07 22:05:17 +0200156 let g:check_screendump_called = v:true
Bram Moolenaar3c8ee622019-08-03 22:55:50 +0200157 if !CanRunVimInTerminal()
158 throw 'Skipped: cannot make screendumps'
159 endif
Drew Vogelea67ba72025-05-07 22:05:17 +0200160 if has('gui_running')
161 call SetupWindowSizeToForVisualDumps()
162 endif
Bram Moolenaar3c8ee622019-08-03 22:55:50 +0200163endfunc
164
165" Command to check that we can Run Vim in a terminal window
166command CheckRunVimInTerminal call CheckRunVimInTerminal()
167func CheckRunVimInTerminal()
168 if !CanRunVimInTerminal()
169 throw 'Skipped: cannot run Vim in a terminal window'
170 endif
171endfunc
Bram Moolenaar8c5a2782019-08-07 23:07:07 +0200172
173" Command to check that we can run the GUI
174command CheckCanRunGui call CheckCanRunGui()
175func CheckCanRunGui()
176 if !has('gui') || ($DISPLAY == "" && !has('gui_running'))
Bram Moolenaar25143152019-08-09 14:13:57 +0200177 throw 'Skipped: cannot start the GUI'
Bram Moolenaar8c5a2782019-08-07 23:07:07 +0200178 endif
179endfunc
180
Bram Moolenaard6fa7bd2021-07-05 14:10:04 +0200181" Command to Check for an environment variable
182command -nargs=1 CheckEnv call CheckEnv(<f-args>)
183func CheckEnv(name)
Bram Moolenaarf6d87792021-07-05 17:49:02 +0200184 if empty(eval('$' .. a:name))
Bram Moolenaard6fa7bd2021-07-05 14:10:04 +0200185 throw 'Skipped: Environment variable ' .. a:name .. ' is not set'
186 endif
187endfunc
188
lilydjwg6e0a18f2024-01-29 20:54:28 +0100189" Command to Check for pure X11 (no Wayland)
190command -nargs=0 CheckX11 call CheckX11()
191func CheckX11()
192 if !empty($WAYLAND_DISPLAY) || empty($DISPLAY)
193 throw 'Skipped: not pure X11 environment'
194 endif
195endfunc
196
Bram Moolenaar8c5a2782019-08-07 23:07:07 +0200197" Command to check that we are using the GUI
198command CheckGui call CheckGui()
199func CheckGui()
200 if !has('gui_running')
201 throw 'Skipped: only works in the GUI'
202 endif
203endfunc
204
205" Command to check that not currently using the GUI
206command CheckNotGui call CheckNotGui()
207func CheckNotGui()
208 if has('gui_running')
209 throw 'Skipped: only works in the terminal'
210 endif
211endfunc
Bram Moolenaar07282f02019-10-10 16:46:17 +0200212
213" Command to check that test is not running as root
214command CheckNotRoot call CheckNotRoot()
215func CheckNotRoot()
216 if IsRoot()
217 throw 'Skipped: cannot run test as root'
218 endif
219endfunc
Bram Moolenaarcde0ff32020-04-04 14:00:39 +0200220
221" Command to check that the current language is English
222command CheckEnglish call CheckEnglish()
223func CheckEnglish()
224 if v:lang != "C" && v:lang !~ '^[Ee]n'
225 throw 'Skipped: only works in English language environment'
226 endif
227endfunc
228
Bram Moolenaarbfe13cc2020-04-12 17:53:12 +0200229" Command to check that loopback device has IPv6 address
230command CheckIPv6 call CheckIPv6()
231func CheckIPv6()
232 if !has('ipv6')
233 throw 'Skipped: cannot use IPv6 networking'
234 endif
235 if !exists('s:ipv6_loopback')
236 let s:ipv6_loopback = s:CheckIPv6Loopback()
237 endif
238 if !s:ipv6_loopback
239 throw 'Skipped: no IPv6 address for loopback device'
240 endif
241endfunc
242
243func s:CheckIPv6Loopback()
244 if has('win32')
245 return system('netsh interface ipv6 show interface') =~? '\<Loopback\>'
246 elseif filereadable('/proc/net/if_inet6')
247 return (match(readfile('/proc/net/if_inet6'), '\slo$') >= 0)
248 elseif executable('ifconfig')
249 for dev in ['lo0', 'lo', 'loop']
250 " NOTE: On SunOS, need specify address family 'inet6' to get IPv6 info.
251 if system('ifconfig ' .. dev .. ' inet6 2>/dev/null') =~? '\<inet6\>'
252 \ || system('ifconfig ' .. dev .. ' 2>/dev/null') =~? '\<inet6\>'
253 return v:true
254 endif
255 endfor
256 else
257 " TODO: How to check it in other platforms?
258 endif
259 return v:false
260endfunc
261
Bram Moolenaar97202d92021-01-28 18:34:35 +0100262" Command to check for not running under ASAN
263command CheckNotAsan call CheckNotAsan()
264func CheckNotAsan()
265 if execute('version') =~# '-fsanitize=[a-z,]*\<address\>'
266 throw 'Skipped: does not work with ASAN'
267 endif
268endfunc
269
Bram Moolenaarcf801d42022-06-21 18:34:42 +0100270" Command to check for not running under valgrind
271command CheckNotValgrind call CheckNotValgrind()
272func CheckNotValgrind()
273 if RunningWithValgrind()
274 throw 'Skipped: does not work well with valgrind'
275 endif
276endfunc
277
Bram Moolenaar40bd5a12021-10-16 21:58:27 +0100278" Command to check for X11 based GUI
279command CheckX11BasedGui call CheckX11BasedGui()
280func CheckX11BasedGui()
281 if !g:x11_based_gui
282 throw 'Skipped: requires X11 based GUI'
283 endif
284endfunc
285
Ernie Rael559f2302022-07-26 14:44:36 +0100286" Command to check that there are two clipboards
287command CheckTwoClipboards call CheckTwoClipboards()
288func CheckTwoClipboards()
289 " avoid changing the clipboard here, only X11 supports both
290 if !has('X11')
291 throw 'Skipped: requires two clipboards'
292 endif
293endfunc
294
Bram Moolenaarf8c52e82021-03-17 12:27:23 +0100295" Command to check for satisfying any of the conditions.
296" e.g. CheckAnyOf Feature:bsd Feature:sun Linux
297command -nargs=+ CheckAnyOf call CheckAnyOf(<f-args>)
298func CheckAnyOf(...)
299 let excp = []
300 for arg in a:000
301 try
302 exe 'Check' .. substitute(arg, ':', ' ', '')
303 return
304 catch /^Skipped:/
305 let excp += [substitute(v:exception, '^Skipped:\s*', '', '')]
306 endtry
307 endfor
308 throw 'Skipped: ' .. join(excp, '; ')
309endfunc
310
311" Command to check for satisfying all of the conditions.
312" e.g. CheckAllOf Unix Gui Option:ballooneval
313command -nargs=+ CheckAllOf call CheckAllOf(<f-args>)
314func CheckAllOf(...)
315 for arg in a:000
316 exe 'Check' .. substitute(arg, ':', ' ', '')
317 endfor
318endfunc
319
Christian Brabandt6f14ef42025-02-09 17:05:21 +0100320" Check if running under Github Actions
321command CheckGithubActions call CheckGithubActions()
322func CheckGithubActions()
323 if expand('$GITHUB_ACTIONS') ==# 'true'
324 throw "Skipped: FIXME: this test doesn't work on Github Actions CI"
325 endif
326endfunc
Bram Moolenaarcde0ff32020-04-04 14:00:39 +0200327" vim: shiftwidth=2 sts=2 expandtab