| 
									
										
										
										
											2017-05-12 19:38:52 +00:00
										 |  |  | #!/bin/bash -eu | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # Author: w0rp <devw0rp@gmail.com> | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | # This script runs tests for the ALE project. The following options are | 
					
						
							|  |  |  | # accepted: | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | #            -v  Enable verbose output | 
					
						
							|  |  |  | # --neovim-only  Run tests only for NeoVim | 
					
						
							|  |  |  | #    --vim-only  Run tests only for Vim | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | RED='\033[0;31m' | 
					
						
							|  |  |  | GREEN='\033[0;32m' | 
					
						
							|  |  |  | NC='\033[0m' | 
					
						
							|  |  |  | CURRENT_IMAGE_ID=d5a1b5915b09 | 
					
						
							|  |  |  | IMAGE=w0rp/ale | 
					
						
							|  |  |  | DOCKER_FLAGS=(--rm -v "$PWD:/testplugin" -v "$PWD/test:/home" -w /testplugin "$IMAGE") | 
					
						
							|  |  |  | EXIT=0 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | tests='test/*.vader test/*/*.vader test/*/*/*.vader test/*/*/*.vader' | 
					
						
							|  |  |  | verbose=0 | 
					
						
							| 
									
										
										
										
											2017-05-20 18:02:01 +00:00
										 |  |  | quiet=0 | 
					
						
							| 
									
										
										
										
											2017-05-12 19:38:52 +00:00
										 |  |  | run_neovim_tests=1 | 
					
						
							|  |  |  | run_vim_tests=1 | 
					
						
							|  |  |  | run_vint=1 | 
					
						
							|  |  |  | run_custom_checks=1 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | while [ $# -ne 0 ]; do | 
					
						
							|  |  |  |     case $1 in | 
					
						
							|  |  |  |     -v) | 
					
						
							|  |  |  |         verbose=1 | 
					
						
							|  |  |  |         shift | 
					
						
							|  |  |  |     ;; | 
					
						
							| 
									
										
										
										
											2017-05-20 18:02:01 +00:00
										 |  |  |     -q) | 
					
						
							|  |  |  |         quiet=1 | 
					
						
							|  |  |  |         shift | 
					
						
							|  |  |  |     ;; | 
					
						
							| 
									
										
										
										
											2017-05-12 19:38:52 +00:00
										 |  |  |     --neovim-only) | 
					
						
							|  |  |  |         run_vim_tests=0 | 
					
						
							|  |  |  |         run_vint=0 | 
					
						
							|  |  |  |         run_custom_checks=0 | 
					
						
							|  |  |  |         shift | 
					
						
							|  |  |  |     ;; | 
					
						
							|  |  |  |     --vim-only) | 
					
						
							|  |  |  |         run_neovim_tests=0 | 
					
						
							|  |  |  |         run_vint=0 | 
					
						
							|  |  |  |         run_custom_checks=0 | 
					
						
							| 
									
										
										
										
											2017-07-09 13:58:17 +00:00
										 |  |  |         shift | 
					
						
							|  |  |  |     ;; | 
					
						
							|  |  |  |     --no-vint) | 
					
						
							|  |  |  |         run_vint=0 | 
					
						
							|  |  |  |         shift | 
					
						
							|  |  |  |     ;; | 
					
						
							|  |  |  |     --no-custom-checks) | 
					
						
							|  |  |  |         run_custom_checks=0 | 
					
						
							|  |  |  |         shift | 
					
						
							| 
									
										
										
										
											2017-05-12 19:38:52 +00:00
										 |  |  |     ;; | 
					
						
							| 
									
										
										
										
											2017-08-10 09:45:12 +00:00
										 |  |  |     --custom-checks-only) | 
					
						
							|  |  |  |         run_vim_tests=0 | 
					
						
							|  |  |  |         run_neovim_tests=0 | 
					
						
							|  |  |  |         run_vint=0 | 
					
						
							|  |  |  |         shift | 
					
						
							|  |  |  |     ;; | 
					
						
							| 
									
										
										
										
											2017-05-12 19:38:52 +00:00
										 |  |  |     --) | 
					
						
							|  |  |  |         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="$*" | 
					
						
							|  |  |  | fi | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-08-22 20:08:32 +00:00
										 |  |  | # Delete .swp files in the test directory, which cause Vim 8 to hang. | 
					
						
							|  |  |  | find test -name '*.swp' -delete | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-05-12 19:38:52 +00:00
										 |  |  | docker images -q w0rp/ale | grep "^$CURRENT_IMAGE_ID" > /dev/null \ | 
					
						
							|  |  |  |     || docker pull "$IMAGE" | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-05-20 18:02:01 +00:00
										 |  |  | function filter-vader-output() { | 
					
						
							|  |  |  |     # When verbose mode is off, suppress output until Vader starts. | 
					
						
							|  |  |  |     local start_output="$verbose" | 
					
						
							|  |  |  |     local filtered_data='' | 
					
						
							| 
									
										
										
										
											2017-05-12 19:38:52 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     while read -r; do | 
					
						
							| 
									
										
										
										
											2017-05-20 18:02:01 +00:00
										 |  |  |         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" | 
					
						
							| 
									
										
										
										
											2017-05-12 19:38:52 +00:00
										 |  |  |                 fi | 
					
						
							| 
									
										
										
										
											2017-05-20 18:02:01 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |                 filtered_data='' | 
					
						
							|  |  |  |             else | 
					
						
							|  |  |  |                 filtered_data="$filtered_data"$'\n'"$REPLY" | 
					
						
							| 
									
										
										
										
											2017-05-12 19:38:52 +00:00
										 |  |  |             fi | 
					
						
							| 
									
										
										
										
											2017-05-20 18:02:01 +00:00
										 |  |  |         else | 
					
						
							|  |  |  |             echo "$REPLY" | 
					
						
							| 
									
										
										
										
											2017-05-12 19:38:52 +00:00
										 |  |  |         fi | 
					
						
							| 
									
										
										
										
											2017-05-20 18:02:01 +00:00
										 |  |  |     done | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2017-05-12 19:38:52 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-05-20 18:02:01 +00:00
										 |  |  | function color-vader-output() { | 
					
						
							|  |  |  |     while read -r; do | 
					
						
							| 
									
										
										
										
											2017-05-12 19:38:52 +00:00
										 |  |  |         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" | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | if ((run_neovim_tests)); then | 
					
						
							|  |  |  |     for vim in $(docker run --rm "$IMAGE" ls /vim-build/bin | grep '^neovim' ); do | 
					
						
							|  |  |  |         echo | 
					
						
							|  |  |  |         echo '========================================' | 
					
						
							|  |  |  |         echo "Running tests for $vim" | 
					
						
							|  |  |  |         echo '========================================' | 
					
						
							|  |  |  |         echo | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         set -o pipefail | 
					
						
							|  |  |  |         docker run -it -e VADER_OUTPUT_FILE=/dev/stderr "${DOCKER_FLAGS[@]}" \ | 
					
						
							|  |  |  |             "/vim-build/bin/$vim" -u test/vimrc \ | 
					
						
							| 
									
										
										
										
											2017-05-20 18:02:01 +00:00
										 |  |  |             --headless "+Vader! $tests" | filter-vader-output | color-vader-output || EXIT=$? | 
					
						
							| 
									
										
										
										
											2017-05-12 19:38:52 +00:00
										 |  |  |         set +o pipefail | 
					
						
							|  |  |  |     done | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     echo | 
					
						
							|  |  |  | fi | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | if ((run_vim_tests)); then | 
					
						
							|  |  |  |     for vim in $(docker run --rm "$IMAGE" ls /vim-build/bin | grep '^vim' ); do | 
					
						
							|  |  |  |         echo | 
					
						
							|  |  |  |         echo '========================================' | 
					
						
							|  |  |  |         echo "Running tests for $vim" | 
					
						
							|  |  |  |         echo '========================================' | 
					
						
							|  |  |  |         echo | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         set -o pipefail | 
					
						
							| 
									
										
										
										
											2017-07-09 13:58:17 +00:00
										 |  |  |         docker run -a stderr -e VADER_OUTPUT_FILE=/dev/stderr "${DOCKER_FLAGS[@]}" \ | 
					
						
							| 
									
										
										
										
											2017-05-12 19:38:52 +00:00
										 |  |  |             "/vim-build/bin/$vim" -u test/vimrc \ | 
					
						
							| 
									
										
										
										
											2017-05-20 18:02:01 +00:00
										 |  |  |             "+Vader! $tests" 2>&1 | filter-vader-output | color-vader-output || EXIT=$? | 
					
						
							| 
									
										
										
										
											2017-05-12 19:38:52 +00:00
										 |  |  |         set +o pipefail | 
					
						
							|  |  |  |     done | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     echo | 
					
						
							|  |  |  | fi | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | if ((run_vint)); then | 
					
						
							|  |  |  |     echo '========================================' | 
					
						
							|  |  |  |     echo 'Running Vint to lint our code' | 
					
						
							|  |  |  |     echo '========================================' | 
					
						
							|  |  |  |     echo 'Vint warnings/errors follow:' | 
					
						
							|  |  |  |     echo | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     set -o pipefail | 
					
						
							|  |  |  |     docker run -a stdout "${DOCKER_FLAGS[@]}" vint -s . || EXIT=$? | 
					
						
							|  |  |  |     set +o pipefail | 
					
						
							|  |  |  |     echo | 
					
						
							|  |  |  | fi | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | if ((run_custom_checks)); then | 
					
						
							|  |  |  |     echo '========================================' | 
					
						
							|  |  |  |     echo 'Running custom checks' | 
					
						
							|  |  |  |     echo '========================================' | 
					
						
							|  |  |  |     echo 'Custom warnings/errors follow:' | 
					
						
							|  |  |  |     echo | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     set -o pipefail | 
					
						
							| 
									
										
										
										
											2017-09-10 12:19:08 +00:00
										 |  |  |     docker run -a stdout "${DOCKER_FLAGS[@]}" test/script/custom-checks . || EXIT=$? | 
					
						
							| 
									
										
										
										
											2017-05-12 19:38:52 +00:00
										 |  |  |     set +o pipefail | 
					
						
							|  |  |  |     echo | 
					
						
							| 
									
										
										
										
											2017-06-29 11:55:00 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     echo '========================================' | 
					
						
							|  |  |  |     echo 'Checking for duplicate tags' | 
					
						
							|  |  |  |     echo '========================================' | 
					
						
							|  |  |  |     echo 'Duplicate tags follow:' | 
					
						
							|  |  |  |     echo | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     grep --exclude=tags -roh '\*.*\*$' doc | sort | uniq -d || EXIT=$? | 
					
						
							| 
									
										
										
										
											2017-08-10 09:45:12 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     echo '========================================' | 
					
						
							|  |  |  |     echo 'Checking for invalid tag references' | 
					
						
							|  |  |  |     echo '========================================' | 
					
						
							|  |  |  |     echo 'Invalid tag references tags follow:' | 
					
						
							|  |  |  |     echo | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     tag_regex='[gb]\?:\?\(ale\|ALE\)[a-zA-Z_\-]\+' | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     # Grep for tags and references, and complain if we find a reference without | 
					
						
							|  |  |  |     # a tag for the reference. Only our tags will be included. | 
					
						
							|  |  |  |     diff -u \ | 
					
						
							|  |  |  |         <(grep --exclude=tags -roh "\*$tag_regex\*" doc | sort -u | sed 's/*//g') \ | 
					
						
							|  |  |  |         <(grep --exclude=tags -roh "|$tag_regex|" doc | sort -u | sed 's/|//g') \ | 
					
						
							|  |  |  |         | grep '^+[^+]' && EXIT=1 | 
					
						
							| 
									
										
										
										
											2017-08-28 21:05:12 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     echo '========================================' | 
					
						
							|  |  |  |     echo 'diff README.md and doc/ale.txt tables' | 
					
						
							|  |  |  |     echo '========================================' | 
					
						
							|  |  |  |     echo 'Differences follow:' | 
					
						
							|  |  |  |     echo | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-09-10 12:19:08 +00:00
										 |  |  |     test/script/check-supported-tools-tables || EXIT=$? | 
					
						
							| 
									
										
										
										
											2017-08-30 20:56:43 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     echo '========================================' | 
					
						
							|  |  |  |     echo 'Look for badly aligned doc tags' | 
					
						
							|  |  |  |     echo '========================================' | 
					
						
							|  |  |  |     echo 'Badly aligned tags follow:' | 
					
						
							|  |  |  |     echo | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     # Documentation tags need to be aligned to the right margin, so look for | 
					
						
							|  |  |  |     # tags which aren't at the right margin. | 
					
						
							|  |  |  |     grep ' \*[^*]\+\*$' doc/ -r \ | 
					
						
							|  |  |  |         | awk '{ sep = index($0, ":"); if (length(substr($0, sep + 1 )) < 79) { print } }' \ | 
					
						
							|  |  |  |         | grep . && EXIT=1 | 
					
						
							| 
									
										
										
										
											2017-09-10 18:42:45 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     echo '========================================' | 
					
						
							|  |  |  |     echo 'Look for table of contents issues' | 
					
						
							|  |  |  |     echo '========================================' | 
					
						
							|  |  |  |     echo | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     test/script/check-toc || EXIT=$? | 
					
						
							| 
									
										
										
										
											2017-05-12 19:38:52 +00:00
										 |  |  | fi | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | exit $EXIT |