|
@@ -0,0 +1,212 @@
|
|
|
+#!/bin/bash
|
|
|
+# This script runs a visual regression test on all the images
|
|
|
+# generated from OSMD samples (npm run generate:current and npm run generate:blessed)
|
|
|
+#
|
|
|
+# inspired by Vexflow's visual regression tests.
|
|
|
+#
|
|
|
+# Prerequisites: ImageMagick
|
|
|
+#
|
|
|
+# On OSX: $ brew install imagemagick
|
|
|
+# On Linux: $ apt-get install imagemagick
|
|
|
+#
|
|
|
+# Usage:
|
|
|
+#
|
|
|
+#
|
|
|
+# First generate the known good or previous state PNG images you want to compare to, e.g. the develop branch or last release:
|
|
|
+# (Server has to be running for this: npm start)
|
|
|
+#
|
|
|
+# npm run generate:blessed
|
|
|
+#
|
|
|
+# Make changes in OSMD, then generate your new images:
|
|
|
+#
|
|
|
+# npm run generate:current
|
|
|
+#
|
|
|
+# Run the regression tests against the blessed images in tests/blessed.
|
|
|
+#
|
|
|
+# # (this should be done from the main OSMD folder)
|
|
|
+# sh test/Util/visual_regression.sh
|
|
|
+#
|
|
|
+# Check build/images/diff/results.txt for results. This file is sorted
|
|
|
+# by PHASH difference (most different files on top.) The composite diff
|
|
|
+# images for failed tests (i.e., PHASH > 1.0) are stored in build/images/diff.
|
|
|
+#
|
|
|
+# If you are satisfied with the differences, copy *.png from build/images
|
|
|
+# into tests/blessed, and submit your change.
|
|
|
+
|
|
|
+# PNG viewer on OSX. Switch this to whatever your system uses.
|
|
|
+# VIEWER=open
|
|
|
+
|
|
|
+# Show images over this PHASH threshold. This is probably too low, but
|
|
|
+# a good first pass.
|
|
|
+THRESHOLD=0.01
|
|
|
+
|
|
|
+# Directories. You might want to change BASE, if you're running from a
|
|
|
+# different working directory.
|
|
|
+BASE=.
|
|
|
+IMAGESPARENTFOLDER=$BASE/data/images
|
|
|
+BLESSED=$IMAGESPARENTFOLDER/blessed
|
|
|
+CURRENT=$IMAGESPARENTFOLDER/current
|
|
|
+DIFF=$IMAGESPARENTFOLDER/diff
|
|
|
+
|
|
|
+# All results are stored here.
|
|
|
+RESULTS=$DIFF/results.txt
|
|
|
+WARNINGS=$DIFF/warnings.txt
|
|
|
+
|
|
|
+mkdir -p $DIFF
|
|
|
+if [ -e "$RESULTS" ]
|
|
|
+then
|
|
|
+ rm $DIFF/*
|
|
|
+fi
|
|
|
+touch $RESULTS
|
|
|
+touch $RESULTS.pass
|
|
|
+touch $RESULTS.fail
|
|
|
+touch $WARNINGS
|
|
|
+
|
|
|
+# If no prefix is provided, test all images.
|
|
|
+if [ "$1" == "" ]
|
|
|
+then
|
|
|
+ files=*.png
|
|
|
+else
|
|
|
+ files=$1*.png
|
|
|
+fi
|
|
|
+
|
|
|
+if [ "`basename $PWD`" == "Util" ]
|
|
|
+then
|
|
|
+ echo Please run this script from the OSMD base directory.
|
|
|
+ exit 1
|
|
|
+fi
|
|
|
+
|
|
|
+# Number of simultaneous jobs
|
|
|
+nproc=$(sysctl -n hw.physicalcpu 2> /dev/null || nproc)
|
|
|
+if [ -n "$NPROC" ]; then
|
|
|
+ nproc=$NPROC
|
|
|
+fi
|
|
|
+
|
|
|
+total=`ls -l $BLESSED/$files | wc -l | sed 's/[[:space:]]//g'`
|
|
|
+
|
|
|
+echo "Running $total tests with threshold $THRESHOLD (nproc=$nproc)..."
|
|
|
+
|
|
|
+function ProgressBar {
|
|
|
+ let _progress=(${1}*100/${2}*100)/100
|
|
|
+ let _done=(${_progress}*4)/10
|
|
|
+ let _left=40-$_done
|
|
|
+ _fill=$(printf "%${_done}s")
|
|
|
+ _empty=$(printf "%${_left}s")
|
|
|
+
|
|
|
+ printf "\rProgress : [${_fill// /#}${_empty// /-}] ${_progress}%%"
|
|
|
+}
|
|
|
+
|
|
|
+function diff_image() {
|
|
|
+ local image=$1
|
|
|
+ local name=`basename $image .png`
|
|
|
+ local blessed=$BLESSED/$name.png
|
|
|
+ local current=$CURRENT/$name.png
|
|
|
+ local diff=$current-temp
|
|
|
+
|
|
|
+ if [ ! -e "$current" ]
|
|
|
+ then
|
|
|
+ echo "Warning: $name.png missing in $CURRENT." >$diff.warn
|
|
|
+ return
|
|
|
+ fi
|
|
|
+
|
|
|
+ if [ ! -e "$blessed" ]
|
|
|
+ then
|
|
|
+ return
|
|
|
+ fi
|
|
|
+
|
|
|
+ cp $blessed $diff-a.png
|
|
|
+ cp $current $diff-b.png
|
|
|
+
|
|
|
+ # Calculate the difference metric and store the composite diff image.
|
|
|
+ local hash=`compare -metric PHASH -highlight-color '#ff000050' $diff-b.png $diff-a.png $diff-diff.png 2>&1`
|
|
|
+
|
|
|
+ local isGT=`echo "$hash > $THRESHOLD" | bc -l`
|
|
|
+ if [ "$isGT" == "1" ]
|
|
|
+ then
|
|
|
+ # Add the result to results.text
|
|
|
+ echo $name $hash >$diff.fail
|
|
|
+ # Threshold exceeded, save the diff and the original, current
|
|
|
+ cp $diff-diff.png $DIFF/$name.png
|
|
|
+ cp $diff-a.png $DIFF/$name'_'Blessed.png
|
|
|
+ cp $diff-b.png $DIFF/$name'_'Current.png
|
|
|
+ echo
|
|
|
+ echo "Test: $name"
|
|
|
+ echo " PHASH value exceeds threshold: $hash > $THRESHOLD"
|
|
|
+ echo " Image diff stored in $DIFF/$name.png"
|
|
|
+ # $VIEWER "$diff-diff.png" "$diff-a.png" "$diff-b.png"
|
|
|
+ # echo 'Hit return to process next image...'
|
|
|
+ # read
|
|
|
+ else
|
|
|
+ echo $name $hash >$diff.pass
|
|
|
+ fi
|
|
|
+ rm -f $diff-a.png $diff-b.png $diff-diff.png
|
|
|
+}
|
|
|
+
|
|
|
+function wait_jobs () {
|
|
|
+ local n=$1
|
|
|
+ while [[ "$(jobs -r | wc -l)" -ge "$n" ]] ; do
|
|
|
+ # echo ===================================== && jobs -lr
|
|
|
+ # wait the oldest job.
|
|
|
+ local pid_to_wait=`jobs -rp | head -1`
|
|
|
+ # echo wait $pid_to_wait
|
|
|
+ wait $pid_to_wait &> /dev/null
|
|
|
+ done
|
|
|
+}
|
|
|
+
|
|
|
+count=0
|
|
|
+for image in $CURRENT/$files
|
|
|
+do
|
|
|
+ count=$((count + 1))
|
|
|
+ ProgressBar ${count} ${total}
|
|
|
+ wait_jobs $nproc
|
|
|
+ diff_image $image &
|
|
|
+done
|
|
|
+wait
|
|
|
+
|
|
|
+cat $CURRENT/*.warn 1>$WARNINGS 2>/dev/null
|
|
|
+rm -f $CURRENT/*.warn
|
|
|
+
|
|
|
+## Check for files newly built that are not yet blessed.
|
|
|
+for image in $CURRENT/$files
|
|
|
+do
|
|
|
+ name=`basename $image .png`
|
|
|
+ blessed=$BLESSED/$name.png
|
|
|
+ current=$CURRENT/$name.png
|
|
|
+
|
|
|
+ if [ ! -e "$blessed" ]
|
|
|
+ then
|
|
|
+ echo " Warning: $name.png missing in $BLESSED." >>$WARNINGS
|
|
|
+ fi
|
|
|
+done
|
|
|
+
|
|
|
+num_warnings=`cat $WARNINGS | wc -l`
|
|
|
+
|
|
|
+cat $CURRENT/*.fail 1>$RESULTS.fail 2>/dev/null
|
|
|
+num_fails=`cat $RESULTS.fail | wc -l`
|
|
|
+rm -f $CURRENT/*.fail
|
|
|
+
|
|
|
+# Sort results by PHASH
|
|
|
+sort -r -n -k 2 $RESULTS.fail >$RESULTS
|
|
|
+sort -r -n -k 2 $CURRENT/*.pass 1>>$RESULTS 2>/dev/null
|
|
|
+rm -f $CURRENT/*.pass $RESULTS.fail $RESULTS.pass
|
|
|
+
|
|
|
+echo
|
|
|
+echo Results stored in $DIFF/results.txt
|
|
|
+echo All images with a difference over threshold, $THRESHOLD, are
|
|
|
+echo available in $DIFF, sorted by perceptual hash.
|
|
|
+echo
|
|
|
+
|
|
|
+if [ "$num_warnings" -gt 0 ]
|
|
|
+then
|
|
|
+ echo
|
|
|
+ echo "You have $num_warnings warning(s):"
|
|
|
+ cat $WARNINGS
|
|
|
+fi
|
|
|
+
|
|
|
+if [ "$num_fails" -gt 0 ]
|
|
|
+then
|
|
|
+ echo "You have $num_fails fail(s):"
|
|
|
+ head -n $num_fails $RESULTS
|
|
|
+else
|
|
|
+ echo "Success - All diffs under threshold!"
|
|
|
+fi
|