diff export-tests/test-layer-exports.sh @ 2558:7535f13569fa

Move test/ to export-tests/ (so it can be distinguished from other test subdirs) and exclude from archive
author Chris Cannam
date Mon, 15 Jun 2020 17:45:04 +0100
parents test/test-layer-exports.sh@5a397accaf59
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/export-tests/test-layer-exports.sh	Mon Jun 15 17:45:04 2020 +0100
@@ -0,0 +1,229 @@
+#!/bin/bash
+#
+# Regression tests for layer export to CSV
+# Must be run from directory that contains this script
+
+# NB hardcoded assumptions here about the contents of the session
+# file, so the session file (all.sv) is also hardcoded. The session is
+# expected to consist of:
+# 
+# - pane 1 with 3 layers (ruler, waveform, instants)
+# - pane 2 with 3 layers (ruler, waveform, values)
+# - pane 3 with 3 layers (ruler, image, regions)
+# - pane 4 with 3 layers (ruler, text, notes)
+# - pane 5 with 2 layers (ruler, 3d plot)
+# - pane 6 with 3 layers (ruler, spectrogram, boxes)
+# - pane 7 with 2 layers (ruler, peak frequency spectrogram)
+
+set -e
+
+if [ -n "$1" ]; then
+    echo "Usage: $0" 1>&2
+    exit 2
+fi
+
+set -u
+
+sv="../sonic-visualiser"
+if [ ! -f "$sv" -o ! -x "$sv" ]; then
+    echo "This script must be run from the sonic-visualiser/test directory" 1>&2
+    exit 1
+fi
+
+version=$("$sv" -v 2>&1 | grep -v App)
+adequate=no
+case "$version" in
+    [012].*) ;;
+    3.[012]) ;;
+    3.[012].*) ;;
+    [1-9]*) adequate=yes ;;
+    *) echo "Failed to query Sonic Visualiser version" 1>&2
+       exit 1 ;;
+esac
+if [ "$adequate" = "no" ]; then
+    echo "Sonic Visualiser version must be at least 3.3 (supporting --osc-script option)" 1>&2
+    exit 1
+fi
+
+session="all.sv"
+
+if [ ! -f "$session" ]; then
+    echo "Session file $session not found" 1>&2
+    exit 1
+fi
+
+tmpdir=$(mktemp -d)
+trap "rm -rf $tmpdir" 0
+
+input="$tmpdir/input.sv"
+
+cp "$session" "$input"
+
+cat > "$tmpdir/script" <<EOF
+# Load the session file
+/open "$input"
+
+# Select each exportable layer in turn and export to a CSV file
+/setcurrent 1 3
+/exportlayer "$tmpdir/instants.csv"
+/setcurrent 2 3
+/exportlayer "$tmpdir/values.csv"
+/setcurrent 3 2
+/exportlayer "$tmpdir/image.csv"
+/setcurrent 3 3
+/exportlayer "$tmpdir/regions.csv"
+/setcurrent 4 2
+/exportlayer "$tmpdir/text.csv"
+/setcurrent 4 3
+/exportlayer "$tmpdir/notes.csv"
+/setcurrent 5 2
+/exportlayer "$tmpdir/3dplot.csv"
+/setcurrent 6 2
+/exportlayer "$tmpdir/spectrogram.csv"
+/setcurrent 6 3
+/exportlayer "$tmpdir/boxes.csv"
+/setcurrent 7 2
+/exportlayer "$tmpdir/peakfreq.csv"
+
+# Note layer can also be exported as MIDI
+/setcurrent 4 3
+/exportlayer "$tmpdir/notes.mid"
+
+# And everything as SVL
+/setcurrent 1 3
+/exportlayer "$tmpdir/instants.svl"
+/setcurrent 2 3
+/exportlayer "$tmpdir/values.svl"
+/setcurrent 3 2
+/exportlayer "$tmpdir/image.svl"
+/setcurrent 3 3
+/exportlayer "$tmpdir/regions.svl"
+/setcurrent 4 2
+/exportlayer "$tmpdir/text.svl"
+/setcurrent 4 3
+/exportlayer "$tmpdir/notes.svl"
+/setcurrent 5 2
+/exportlayer "$tmpdir/3dplot.svl"
+/setcurrent 6 2
+/exportlayer "$tmpdir/spectrogram.svl"
+/setcurrent 6 3
+/exportlayer "$tmpdir/boxes.svl"
+/setcurrent 7 2
+/exportlayer "$tmpdir/peakfreq.svl"
+
+# Now test exporting only the contents of a (multiple) selection. This
+# is only supported for CSV files.
+# First set waveform layer as current, to avoid snapping the selection
+# to the contents of an annotation layer.
+/setcurrent 1 2
+
+# Make a selection
+/select 8 10
+/addselect 14 16
+
+# And repeat all the previous exports
+/setcurrent 1 3
+/exportlayer "$tmpdir/selected-instants.csv"
+/setcurrent 2 3
+/exportlayer "$tmpdir/selected-values.csv"
+/setcurrent 3 2
+/exportlayer "$tmpdir/selected-image.csv"
+/setcurrent 3 3
+/exportlayer "$tmpdir/selected-regions.csv"
+/setcurrent 4 2
+/exportlayer "$tmpdir/selected-text.csv"
+/setcurrent 4 3
+/exportlayer "$tmpdir/selected-notes.csv"
+/setcurrent 5 2
+/exportlayer "$tmpdir/selected-3dplot.csv"
+/setcurrent 6 2
+/exportlayer "$tmpdir/selected-spectrogram.csv"
+/setcurrent 6 3
+/exportlayer "$tmpdir/selected-boxes.csv"
+/setcurrent 7 2
+/exportlayer "$tmpdir/selected-peakfreq.csv"
+
+/setcurrent 4 3
+/exportlayer "$tmpdir/selected-notes.mid"
+
+# If we also zoom in vertically in the 3d plot, our export should
+# include only the zoomed area - check this
+/setcurrent 5 2
+/zoomvertical 0 12
+/exportlayer "$tmpdir/selected-zoomed-3dplot.csv"
+
+/quit
+EOF
+
+"$sv" --no-splash --osc-script "$tmpdir/script"
+
+for type in instants values image regions text notes 3dplot spectrogram boxes peakfreq ; do
+    for format in csv svl ; do
+        for pfx in "" "selected-"; do
+            if [ "$format" = "svl" ] && [ -n "$pfx" ]; then
+                continue
+            fi
+            actual="$tmpdir/$pfx$type.$format"
+            expected="layers-expected/$pfx$type.$format"
+            if ! cmp -s "$actual" "$expected" ; then
+                echo
+                if [ -z "$pfx" ]; then
+                    echo "Test failed for file type $format, layer type \"$type\"!"
+                else
+                    echo "Test failed for selected regions in layer type \"$type\"!"
+                fi
+                echo
+                echo "Actual:"
+                ls -l "$actual"
+                echo "Expected:"
+                ls -l "$expected"
+                echo
+                echo "Diff begins:"
+                git diff --no-index --word-diff=color --word-diff-regex=. "$actual" "$expected" | head
+                echo
+            fi
+        done
+    done
+done
+
+for csv in selected-zoomed-3dplot.csv ; do
+    actual="$tmpdir/$csv"
+    expected="layers-expected/$csv"
+    if ! cmp -s "$actual" "$expected" ; then
+        echo
+        echo "Test failed for \"$csv\"!"
+        echo
+        echo "Actual:"
+        ls -l "$actual"
+        echo "Expected:"
+        ls -l "$expected"
+        echo
+        echo "Diff begins:"
+        git diff --no-index --word-diff=color --word-diff-regex=. "$actual" "$expected" | head
+        echo
+    fi
+done
+
+for other in notes.mid selected-notes.mid ; do
+    actual="$tmpdir/$other"
+    expected="layers-expected/$other"
+    if ! cmp -s "$actual" "$expected" ; then
+        echo
+        if [ -z "$pfx" ]; then
+            echo "Test failed for \"$other\"!"
+        fi            
+        echo
+        echo "Actual:"
+        ls -l "$actual"
+        echo "Expected:"
+        ls -l "$expected"
+        echo
+        od -c "$actual" > "$actual".txt
+        od -c "$expected" > "$tmpdir/expected-$other".txt
+        echo
+        echo "Diff:"
+        git diff --no-index --word-diff=color --word-diff-regex=. "$actual".txt "expected-$other".txt | head
+        echo
+    fi
+done
+