X-Git-Url: https://git.madduck.net/etc/vim.git/blobdiff_plain/0ee596c5c5e11fc79598407eaf22f83d279f7e9e..5a4872f466ebd76ddd532bdf2798554421c53df4:/.vim/bundle/ale/run-tests diff --git a/.vim/bundle/ale/run-tests b/.vim/bundle/ale/run-tests new file mode 100755 index 00000000..a4ddb051 --- /dev/null +++ b/.vim/bundle/ale/run-tests @@ -0,0 +1,317 @@ +#!/usr/bin/env bash +DOCKER=${DOCKER:-docker} +export DOCKER +# Author: w0rp +# +# This script runs tests for the ALE project. Run `./run-tests --help` for +# options, or read the output below. +# + +image=docker.io/denseanalysis/ale + +# Create docker image tag based on Dockerfile contents +if [ -n "$(command -v md5)" ]; then + image_tag=$(md5 -q Dockerfile) +else + image_tag=$(md5sum Dockerfile | cut -d' ' -f1) +fi +git_version=$(git describe --always --tags) + +# Used in all test scripts for running the selected Docker image. +DOCKER_RUN_IMAGE="$image:$image_tag" +export DOCKER_RUN_IMAGE + +tests='test/*.vader test/*/*.vader test/*/*/*.vader' +# These flags are forwarded to the script for running Vader tests. +verbose_flag='' +quiet_flag='' +run_neovim_07_tests=1 +run_neovim_08_tests=1 +run_vim_80_tests=1 +run_vim_90_tests=1 +run_lua_tests=1 +run_linters=1 + +while [ $# -ne 0 ]; do + case $1 in + -v) + verbose_flag='-v' + shift + ;; + -q) + quiet_flag='-q' + shift + ;; + --build-image) + run_vim_80_tests=0 + run_vim_90_tests=0 + run_neovim_07_tests=0 + run_neovim_08_tests=0 + run_lua_tests=0 + run_linters=0 + shift + ;; + --neovim-only) + run_vim_80_tests=0 + run_vim_90_tests=0 + run_lua_tests=0 + run_linters=0 + shift + ;; + --neovim-07-only) + run_neovim_08_tests=0 + run_vim_80_tests=0 + run_vim_90_tests=0 + run_lua_tests=0 + run_linters=0 + shift + ;; + --neovim-08-only) + run_neovim_07_tests=0 + run_vim_80_tests=0 + run_vim_90_tests=0 + run_lua_tests=0 + run_linters=0 + shift + ;; + --vim-only) + run_neovim_07_tests=0 + run_neovim_08_tests=0 + run_lua_tests=0 + run_linters=0 + shift + ;; + --vim-80-only) + run_neovim_07_tests=0 + run_neovim_08_tests=0 + run_vim_90_tests=0 + run_lua_tests=0 + run_linters=0 + shift + ;; + --vim-90-only) + run_neovim_07_tests=0 + run_neovim_08_tests=0 + run_vim_80_tests=0 + run_lua_tests=0 + run_linters=0 + shift + ;; + --linters-only) + run_vim_80_tests=0 + run_vim_90_tests=0 + run_neovim_07_tests=0 + run_neovim_08_tests=0 + run_lua_tests=0 + shift + ;; + --lua-only) + run_vim_80_tests=0 + run_vim_90_tests=0 + run_neovim_07_tests=0 + run_neovim_08_tests=0 + run_linters=0 + shift + ;; + --fast) + run_vim_80_tests=0 + run_vim_90_tests=0 + run_neovim_07_tests=0 + run_neovim_08_tests=1 + shift + ;; + --help) + echo 'Usage: ./run-tests [OPTION]... [FILE]...' + echo + echo 'Filenames can be given as arguments to run a subset of tests.' + echo 'For example: ./run-tests test/test_ale_var.vader' + echo + echo 'Options:' + echo ' -v Enable verbose output' + echo ' -q Hide output for successful tests' + echo ' --build-image Run docker image build only.' + echo ' --neovim-only Run tests only for Neovim' + echo ' --neovim-07-only Run tests only for Neovim 0.7' + echo ' --neovim-08-only Run tests only for Neovim 0.8' + echo ' --vim-only Run tests only for Vim' + echo ' --vim-80-only Run tests only for Vim 8.2' + echo ' --vim-90-only Run tests only for Vim 9.0' + echo ' --lua-only Run only Lua tests' + echo ' --linters-only Run only Vint and custom checks' + echo ' --fast Run only the fastest Vim and custom checks' + echo ' --help Show this help text' + echo ' -- Stop parsing options after this' + exit 0 + ;; + --) + shift + break + ;; + -?*) + echo "Invalid argument: $1" 1>&2 + exit 1 + ;; + *) + break + ;; + esac +done + +# Allow tests to be passed as arguments. +if [ $# -ne 0 ]; then + # This doesn't perfectly handle work splitting, but none of our files + # have spaces in the names. + tests="$*" + + # Don't run other tools when targeting tests. + run_linters=0 + run_lua_tests=0 +fi + +# Delete .swp files in the test directory, which cause Vim 8 to hang. +find test -name '*.swp' -delete + +set -eu + +# Check if docker un image is available locally +has_image=$(docker images --quiet "${image}:${image_tag}" | wc -l) + +if [[ "$DOCKER" == docker ]]; then + arch=$(docker info -f '{{ .Architecture }}') +elif [[ "$DOCKER" == podman ]]; then + arch=$(podman info -f '{{ .Host.Arch }}') + if [[ "$arch" == "amd64" ]]; then + arch="x86_64" + fi +else + echo "The DOCKER environment variable must be docker or podman, not ${DOCKER}" + exit 1 +fi + +download_image() { + if [[ $arch != x86_64 ]]; then + echo "Pre-built docker image is not available for architecture ${arch}" + return 1 + fi + echo "Downloading run image ${image}:${image_tag}" + docker pull "${image}:${image_tag}" &> /dev/null +} + +if [ "$has_image" -eq 0 ] && ! download_image; then + echo "Building run image ${image}:${image_tag}" + + build_args=( --build-arg GIT_VERSION="$git_version" ) + + if [[ $arch != x86_64 ]]; then + echo "Building testbed/vim:24 for $arch" + testbed_vim_ref=902917c4caa50db2f2e80009b839605602f9f014 + "$DOCKER" build -t "testbed/vim:$testbed_vim_ref" "https://github.com/Vimjas/vim-testbed.git#$testbed_vim_ref" + build_args+=( --build-arg TESTBED_VIM_VERSION="$testbed_vim_ref" ) + fi + + "$DOCKER" build "${build_args[@]}" -t "${image}:${image_tag}" . + "$DOCKER" tag "${image}:${image_tag}" "${image}:latest" + + if [[ -z "${DOCKER_HUB_USER:-}" || -z "${DOCKER_HUB_PASS:-}" ]]; then + echo "Docker Hub credentials not set, skip push" + else + echo "Push ${image}:${image_tag} to Docker Hub" + echo "$DOCKER_HUB_PASS" | docker login -u "$DOCKER_HUB_USER" --password-stdin + docker push "${image}:${image_tag}" + fi +else + echo "Docker run image ${image}:${image_tag} ready" +fi + +"$DOCKER" tag "${image}:${image_tag}" "${image}:latest" + +output_dir=$(mktemp -d 2>/dev/null || mktemp -d -t 'mytmpdir') + +trap '{ rm -rf "$output_dir"; }' EXIT + +file_number=0 +pid_list='' + +# Used for killing tests when you kill the script. +cancel_tests() { + set +e + + if [ -n "$pid_list" ]; then + for pid in $pid_list; do + kill "$pid" + wait "$pid" + done + fi + + # shellcheck disable=SC2046 + docker kill $(docker ps -a -q --filter ancestor="$image" --format='{{.ID}}') &> /dev/null + + if [ -d "$output_dir" ]; then + rm -rf "$output_dir" + fi + + echo + exit 1 +} + +trap cancel_tests INT TERM + +for vim in $("$DOCKER" run --rm "$DOCKER_RUN_IMAGE" ls /vim-build/bin | grep '^neovim\|^vim' ); do + if ( [[ $vim =~ ^vim-v8.0 ]] && ((run_vim_80_tests)) ) \ + || ( [[ $vim =~ ^vim-v9.0 ]] && ((run_vim_90_tests)) ) \ + || ( [[ $vim =~ ^neovim-v0.7 ]] && ((run_neovim_07_tests)) ) \ + || ( [[ $vim =~ ^neovim-v0.8 ]] && ((run_neovim_08_tests)) ); then + echo "Starting Vim: $vim..." + file_number=$((file_number+1)) + test/script/run-vader-tests $quiet_flag $verbose_flag "$vim" "$tests" \ + > "$output_dir/$file_number" 2>&1 & + pid_list="$pid_list $!" + fi +done + +if ((run_lua_tests)); then + echo "Starting Lua tests..." + file_number=$((file_number+1)) + test/script/run-lua-tests $quiet_flag > "$output_dir/$file_number" 2>&1 & + pid_list="$pid_list $!" +fi + +if ((run_linters)); then + echo "Starting Vint..." + file_number=$((file_number+1)) + test/script/run-vint > "$output_dir/$file_number" 2>&1 & + pid_list="$pid_list $!" + + echo "Starting Custom checks..." + file_number=$((file_number+1)) + test/script/custom-checks &> "$output_dir/$file_number" 2>&1 & + pid_list="$pid_list $!" +fi + +echo + +failed=0 +index=0 + +for pid in $pid_list; do + this_failed=0 + index=$((index+1)) + + if ! wait "$pid"; then + failed=1 + this_failed=1 + fi + + # Hide output for things that passed if -q is set. + if [ "$quiet_flag" != '-q' ] || ((this_failed)); then + cat "$output_dir/$index" + fi +done + +if ((failed)); then + echo 'Something went wrong!' +else + echo 'All tests passed!' +fi + +exit $failed