#!/usr/bin/env bash set -e set -u image=w0rp/ale docker_flags=(--rm -v "$PWD:/testplugin" -v "$PWD/test:/home" -w /testplugin "$image") red='\033[0;31m' green='\033[0;32m' nc='\033[0m' verbose=0 quiet=0 exit_code=0 while [ $# -ne 0 ]; do case $1 in -v) verbose=1 shift ;; -q) quiet=1 shift ;; --) shift break ;; -?*) echo "Invalid argument: $1" 1>&2 exit 1 ;; *) break ;; esac done vim="$1" tests="$2" function filter-vader-output() { # When verbose mode is off, suppress output until Vader starts. local start_output="$verbose" local filtered_data='' while read -r; do if ((!start_output)); then if [[ "$REPLY" = *'Starting Vader:'* ]]; then start_output=1 else continue fi fi if ((quiet)); then if [[ "$REPLY" = *'Starting Vader:'* ]]; then filtered_data="$REPLY" elif [[ "$REPLY" = *'Success/Total'* ]]; then success="$(echo -n "$REPLY" | grep -o '[0-9]\+/' | head -n1 | cut -d/ -f1)" total="$(echo -n "$REPLY" | grep -o '/[0-9]\+' | head -n1 | cut -d/ -f2)" if [ "$success" -lt "$total" ]; then echo "$filtered_data" echo "$REPLY" fi filtered_data='' else filtered_data="$filtered_data"$'\n'"$REPLY" fi else echo "$REPLY" fi done } function color-vader-output() { while read -r; do if [[ "$REPLY" = *'[EXECUTE] (X)'* ]]; then echo -en "$red" elif [[ "$REPLY" = *'[EXECUTE]'* ]] || [[ "$REPLY" = *'[ GIVEN]'* ]]; then echo -en "$nc" fi if [[ "$REPLY" = *'Success/Total'* ]]; then success="$(echo -n "$REPLY" | grep -o '[0-9]\+/' | head -n1 | cut -d/ -f1)" total="$(echo -n "$REPLY" | grep -o '/[0-9]\+' | head -n1 | cut -d/ -f2)" if [ "$success" -lt "$total" ]; then echo -en "$red" else echo -en "$green" fi echo "$REPLY" echo -en "$nc" else echo "$REPLY" fi done echo -en "$nc" } echo echo '========================================' echo "Running tests for $vim" echo '========================================' echo set -o pipefail docker run -a stderr -e VADER_OUTPUT_FILE=/dev/stderr "${docker_flags[@]}" \ "/vim-build/bin/$vim" -u test/vimrc \ "+Vader! $tests" 2>&1 | filter-vader-output | color-vader-output || exit_code=$? set +o pipefail exit "$exit_code"