diff options
Diffstat (limited to 'mnv/src/testdir/util/check.mnv')
| -rw-r--r-- | mnv/src/testdir/util/check.mnv | 364 |
1 files changed, 364 insertions, 0 deletions
diff --git a/mnv/src/testdir/util/check.mnv b/mnv/src/testdir/util/check.mnv new file mode 100644 index 0000000000..731455ca11 --- /dev/null +++ b/mnv/src/testdir/util/check.mnv @@ -0,0 +1,364 @@ +source util/shared.mnv +source util/term_util.mnv + +" uses line-continuation +let s:cpo_save = &cpo +set cpo&mnv + +command -nargs=1 MissingFeature throw 'Skipped: ' .. <args> .. ' feature missing' + +" Command to check for the presence of a feature. +command -nargs=1 CheckFeature call CheckFeature(<f-args>) +func CheckFeature(name) + if !has(a:name, 1) + throw 'Checking for non-existent feature ' .. a:name + endif + if !has(a:name) + MissingFeature a:name + endif +endfunc + +" Command to check for the absence of a feature. +command -nargs=1 CheckNotFeature call CheckNotFeature(<f-args>) +func CheckNotFeature(name) + if !has(a:name, 1) + throw 'Checking for non-existent feature ' .. a:name + endif + if has(a:name) + throw 'Skipped: ' .. a:name .. ' feature present' + endif +endfunc + +" Command to check for the presence of a working option. +command -nargs=1 CheckOption call CheckOption(<f-args>) +func CheckOption(name) + if !exists('&' .. a:name) + throw 'Checking for non-existent option ' .. a:name + endif + if !exists('+' .. a:name) + throw 'Skipped: ' .. a:name .. ' option not supported' + endif +endfunc + +" Command to check for the presence of a built-in function. +command -nargs=1 CheckFunction call CheckFunction(<f-args>) +func CheckFunction(name) + if !exists('?' .. a:name) + throw 'Checking for non-existent function ' .. a:name + endif + if !exists('*' .. a:name) + throw 'Skipped: ' .. a:name .. ' function missing' + endif +endfunc + +" Command to check for the presence of an Ex command +command -nargs=1 CheckCommand call CheckCommand(<f-args>) +func CheckCommand(name) + if !exists(':' .. a:name) + throw 'Skipped: ' .. a:name .. ' command not supported' + endif +endfunc + +" Command to check for the presence of a shell command +command -nargs=1 CheckExecutable call CheckExecutable(<f-args>) +func CheckExecutable(name) + if !executable(a:name) + throw 'Skipped: ' .. a:name .. ' program not executable' + endif +endfunc + +" Command to check for the presence of python. Argument should have been +" obtained with PythonProg() +func CheckPython(name) + if a:name == '' + throw 'Skipped: python command not available' + endif +endfunc + +" Command to check for running on MS-Windows +command CheckMSWindows call CheckMSWindows() +func CheckMSWindows() + if !has('win32') + throw 'Skipped: only works on MS-Windows' + endif +endfunc + +" Command to check for NOT running on MS-Windows +command CheckNotMSWindows call CheckNotMSWindows() +func CheckNotMSWindows() + if has('win32') + throw 'Skipped: does not work on MS-Windows' + endif +endfunc + +" Command to check for running on Unix +command CheckUnix call CheckUnix() +func CheckUnix() + if !has('unix') + throw 'Skipped: only works on Unix' + endif +endfunc + +" Command to check for running on Linux +command CheckLinux call CheckLinux() +func CheckLinux() + if !has('linux') + throw 'Skipped: only works on Linux' + endif +endfunc + +" Command to check for not running on a BSD system. +command CheckNotBSD call CheckNotBSD() +func CheckNotBSD() + if has('bsd') + throw 'Skipped: does not work on BSD' + endif +endfunc + +" Command to check for not running on OpenBSD +command CheckNotOpenBSD call CheckNotOpenBSD() +func CheckNotOpenBSD() + if has('bsd') + let uname = trim(system('uname')) + if uname == 'OpenBSD' + throw 'Skipped: does not work on OpenBSD' + endif + endif +endfunc + +" Command to check for not running on a MacOS +command CheckNotMac call CheckNotMac() +func CheckNotMac() + if has('mac') + throw 'Skipped: does not work on MacOS' + endif +endfunc + +" Command to check for not running on a MacOS M1 system. +command CheckNotMacM1 call CheckNotMacM1() +func CheckNotMacM1() + if has('mac') && system('uname -a') =~ '\<arm64\>' + throw 'Skipped: does not work on MacOS M1' + endif +endfunc + +" Command to check whether PowerShell is available +command CheckPowerShell call CheckPowerShell() +func CheckPowerShell() + if !executable('powershell') && !executable('pwsh') + throw 'Skipped: requires Powershell to be installed' + endif +endfunc + +func SetupWindowSizeToForVisualDumps() + " The dumps used as reference in these tests were created with a terminal + " width of 75 columns. The mnv window that uses the remainder of the GUI + " window width must be at least 3 columns. In theory this means we need the + " GUI shell to provide 78+ columns. However the GTK3 resize logic is flaky, + " sometimes resulting in X11 Configure events that are narrower than + " expected by a number of pixels equal to 2 column widths. Therefore + " setting 80 columns ensures that the GUI shell can still provide 78+ + " columns. This is very likely papering over a GTK3 resize bug but one that + " has existed for a very long time. Establishing this workaround is meant to + " get the GTK3 code working under CI so that we can focus on removing this + " over the long term. + if &columns != 80 + set columns=80 + endif + " Without resetting lines, some GTK3 resize events can carry over between + " tests, which invalidate assumptions in the scrollbar offset calculations. + if &lines != 25 + set lines=25 + endif +endfunc + +" Command to check that making screendumps is supported. +" Caller must source util/screendump.mnv +command CheckScreendump call CheckScreendump() +func CheckScreendump() + let g:check_screendump_called = v:true + if !CanRunMNVInTerminal() + throw 'Skipped: cannot make screendumps' + endif + if has('gui_running') + call SetupWindowSizeToForVisualDumps() + endif +endfunc + +" Command to check that we can Run MNV in a terminal window +command CheckRunMNVInTerminal call CheckRunMNVInTerminal() +func CheckRunMNVInTerminal() + if !CanRunMNVInTerminal() + throw 'Skipped: cannot run MNV in a terminal window' + endif +endfunc + +" Command to check that we can run the GUI +command CheckCanRunGui call CheckCanRunGui() +func CheckCanRunGui() + if !has('gui') || ($DISPLAY == "" && !has('gui_running')) + throw 'Skipped: cannot start the GUI' + endif +endfunc + +" Command to Check for an environment variable +command -nargs=1 CheckEnv call CheckEnv(<f-args>) +func CheckEnv(name) + if empty(eval('$' .. a:name)) + throw 'Skipped: Environment variable ' .. a:name .. ' is not set' + endif +endfunc + +" Command to Check for pure X11 (no Wayland) +command -nargs=0 CheckX11 call CheckX11() +func CheckX11() + if !empty($WAYLAND_DISPLAY) || empty($DISPLAY) + throw 'Skipped: not pure X11 environment' + endif +endfunc + +" Command to check that we are using the GUI +command CheckGui call CheckGui() +func CheckGui() + if !has('gui_running') + throw 'Skipped: only works in the GUI' + endif +endfunc + +" Command to check that not currently using the GUI +command CheckNotGui call CheckNotGui() +func CheckNotGui() + if has('gui_running') + throw 'Skipped: only works in the terminal' + endif +endfunc + +" Command to check that test is not running as root +command CheckNotRoot call CheckNotRoot() +func CheckNotRoot() + if IsRoot() + throw 'Skipped: cannot run test as root' + endif +endfunc + +" Command to check that the current language is English +command CheckEnglish call CheckEnglish() +func CheckEnglish() + if v:lang != "C" && v:lang !~ '^[Ee]n' + throw 'Skipped: only works in English language environment' + endif +endfunc + +" Command to check that loopback device has IPv6 address +command CheckIPv6 call CheckIPv6() +func CheckIPv6() + if !has('ipv6') + throw 'Skipped: cannot use IPv6 networking' + endif + if !exists('s:ipv6_loopback') + let s:ipv6_loopback = s:CheckIPv6Loopback() + endif + if !s:ipv6_loopback + throw 'Skipped: no IPv6 address for loopback device' + endif +endfunc + +func s:CheckIPv6Loopback() + if has('win32') + return system('netsh interface ipv6 show interface') =~? '\<Loopback\>' + elseif filereadable('/proc/net/if_inet6') + return (match(readfile('/proc/net/if_inet6'), '\slo$') >= 0) + elseif executable('ifconfig') + for dev in ['lo0', 'lo', 'loop'] + " NOTE: On SunOS, need specify address family 'inet6' to get IPv6 info. + if system('ifconfig ' .. dev .. ' inet6 2>/dev/null') =~? '\<inet6\>' + \ || system('ifconfig ' .. dev .. ' 2>/dev/null') =~? '\<inet6\>' + return v:true + endif + endfor + else + " TODO: How to check it in other platforms? + endif + return v:false +endfunc + +" Command to check for not running under ASAN +command CheckNotAsan call CheckNotAsan() +func CheckNotAsan() + if execute('version') =~# '-fsanitize=[a-z,]*\<address\>' + throw 'Skipped: does not work with ASAN' + endif +endfunc + +" Command to check for not running under valgrind +command CheckNotValgrind call CheckNotValgrind() +func CheckNotValgrind() + if RunningWithValgrind() + throw 'Skipped: does not work well with valgrind' + endif +endfunc + +" Command to check for X11 based GUI +command CheckX11BasedGui call CheckX11BasedGui() +func CheckX11BasedGui() + if !g:x11_based_gui + throw 'Skipped: requires X11 based GUI' + endif +endfunc + +" Command to check that there are two clipboards +command CheckTwoClipboards call CheckTwoClipboards() +func CheckTwoClipboards() + " avoid changing the clipboard here, only X11 supports both + if !has('X11') + throw 'Skipped: requires two clipboards' + endif +endfunc + +" Command to check for satisfying any of the conditions. +" e.g. CheckAnyOf Feature:bsd Feature:sun Linux +command -nargs=+ CheckAnyOf call CheckAnyOf(<f-args>) +func CheckAnyOf(...) + let excp = [] + for arg in a:000 + try + exe 'Check' .. substitute(arg, ':', ' ', '') + return + catch /^Skipped:/ + let excp += [substitute(v:exception, '^Skipped:\s*', '', '')] + endtry + endfor + throw 'Skipped: ' .. join(excp, '; ') +endfunc + +" Command to check for satisfying all of the conditions. +" e.g. CheckAllOf Unix Gui Option:ballooneval +command -nargs=+ CheckAllOf call CheckAllOf(<f-args>) +func CheckAllOf(...) + for arg in a:000 + exe 'Check' .. substitute(arg, ':', ' ', '') + endfor +endfunc + +" Check if running under Github Actions +command CheckGithubActions call CheckGithubActions() +func CheckGithubActions() + if expand('$GITHUB_ACTIONS') ==# 'true' + throw "Skipped: FIXME: this test doesn't work on Github Actions CI" + endif +endfunc + +command RunSocketServer call RunSocketServer() +func RunSocketServer() + if has("socketserver") && v:servername == "" + try + call remote_startserver('MNVSOCKETSERVERTEST') + catch " not possible to start a remote server + throw 'Skipped: Cannot start remote server' + endtry + endif +endfunc + +let &cpo = s:cpo_save +unlet s:cpo_save +" mnv: shiftwidth=2 sts=2 expandtab |
