| #!/bin/sh -e |
| # |
| # The following steps are to be taken by this script: |
| # 1) Remove all files from the "dumps" directory. |
| # 2) Generate screendumps for each syntax test and each self-test. |
| # 3) Unconditionally move each batch of screendumps to "dumps"; if generated |
| # files differ on repeated runs, always remove these files from "dumps". |
| # 4) Repeat steps 2) and 3) once or as many times as requested with the "$1" |
| # argument. |
| # 5) Summarise any differences. |
| # |
| # Provided that "git difftool" is set up (see src/testdir/commondumps.vim), |
| # run "git difftool HEAD -- '**/*.dump'" to collate tracked and generated |
| # screendumps. |
| |
| case "$1" in |
| -h | --help) |
| printf >&2 "Usage: [time VIM_SYNTAX_TEST_LOG=/tmp/log] $0 [1 | 2 | ...]\n" |
| exit 0 |
| ;; |
| esac |
| |
| tries="${1:-1}" |
| shift $# |
| |
| case "$tries" in |
| 0* | *[!0-9]*) |
| exit 80 |
| ;; |
| esac |
| |
| test -x "$(command -v make)" || exit 81 |
| test -x "$(command -v git)" || exit 82 |
| |
| case "$(git status --porcelain=v1)" in |
| '') ;; |
| *) printf >&2 'Resolve ALL changes before proceeding.\n' |
| exit 83 |
| ;; |
| esac |
| |
| templet=$(printf "\t\t\t\t$(tput rev)%%s$(tput sgr0)") || exit 84 |
| cd "$(dirname "$0")/../../../syntax" || exit 85 |
| set +f |
| rm testdir/dumps/*.dump || exit 86 |
| spuriosities='' |
| |
| # Because the clean target of Make will be executed before each syntax test, |
| # this environment variable needs to be pointed to an existing file that is |
| # created in a directory not affectable by the target. |
| if test -w "$VIM_SYNTAX_TEST_LOG" |
| then |
| log=-e VIM_SYNTAX_TEST_LOG="$VIM_SYNTAX_TEST_LOG" |
| else |
| log= |
| fi |
| |
| for f in testdir/input/*.* |
| do |
| test ! -d "$f" || continue |
| b=$(basename "$f") |
| i=0 |
| printf "$templet\n\n" "$b" |
| |
| while test "$i" -le "$tries" |
| do |
| make $log clean "$b" test || : |
| |
| case "$i" in |
| 0) mv testdir/failed/*.dump testdir/dumps/ |
| ;; |
| *) case "$(printf '%s' testdir/failed/*.dump)" in |
| testdir/failed/\*.dump) |
| # (Repeatable) success. |
| ;; |
| *) spuriosities="${spuriosities}${b} " |
| p=${b%.*} |
| rm -f testdir/dumps/"$p"_[0-9][0-9].dump \ |
| testdir/dumps/"$p"_[0-9][0-9][0-9].dump \ |
| testdir/dumps/"$p"_[0-9][0-9][0-9][0-9].dump |
| ;; |
| esac |
| ;; |
| esac |
| |
| i=$(($i + 1)) |
| sleep 1 |
| done |
| done |
| |
| # For a 20-file set, initially fail for a series of: 1-6, 7-12, 13-18, 19-20. |
| tries=$(($tries + 3)) |
| i=0 |
| |
| while test "$i" -le "$tries" |
| do |
| make $log clean self-testing test || : |
| |
| case "$i" in |
| [0-3]) mv testdir/failed/dots_*.dump testdir/dumps/ |
| ;; |
| *) case "$(printf '%s' testdir/failed/*.dump)" in |
| testdir/failed/\*.dump) |
| # (Repeatable) success. |
| ;; |
| *) spuriosities="${spuriosities}dots_xy " |
| rm -f testdir/dumps/dots_*.dump |
| ;; |
| esac |
| ;; |
| esac |
| |
| sleep 1 |
| i=$(($i + 1)) |
| done |
| |
| make clean |
| git diff --compact-summary |
| |
| if test -n "$spuriosities" |
| then |
| printf '\n%s\n' "$spuriosities" |
| exit 87 |
| fi |
| |
| # vim:sw=8:ts=8:noet:nosta: |