aboutsummaryrefslogtreecommitdiffhomepage
path: root/test
diff options
context:
space:
mode:
Diffstat (limited to 'test')
-rwxr-xr-xtest/test-abstraction-db-roundtrip.sh97
1 files changed, 97 insertions, 0 deletions
diff --git a/test/test-abstraction-db-roundtrip.sh b/test/test-abstraction-db-roundtrip.sh
new file mode 100755
index 0000000..3051b78
--- /dev/null
+++ b/test/test-abstraction-db-roundtrip.sh
@@ -0,0 +1,97 @@
+#!/usr/bin/env sh
+# test-abstraction-db-roundtrip.sh
+#
+# Reads each <doc>.abstraction.db back into the abstraction, emits it as
+# .ssp, and requires the result to be byte identical to the .ssp written
+# from the same document.
+#
+# What that proves: the two serialisations really do carry the same thing.
+# test-abstraction-db.sh counts fields and compares them; this reconstructs
+# the whole document from the database and holds it against the text.
+#
+# Usage (needs the sample documents, since both artefacts are generated):
+# SpinePOD=../../markup/sisudoc-spine-samples/markup/pod-samples/pod \
+# ./test/test-abstraction-db-roundtrip.sh ./bin/spine-ldc
+#
+# Exit codes:
+# 0 every database re-emits its document's .ssp exactly
+# 1 one or more do not
+# 2 set-up problem
+
+set -e
+
+SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
+SPINE_DIR="$(cd "$SCRIPT_DIR/.." && pwd)"
+
+if [ -z "$SpinePOD" ]; then
+ echo "ERROR: \$SpinePOD is not set." >&2
+ echo " e.g. SpinePOD=../../markup/sisudoc-spine-samples/markup/pod-samples/pod" >&2
+ exit 2
+fi
+SAMPLES_RAW="$SPINE_DIR/$SpinePOD"
+if [ -d "$SAMPLES_RAW" ]; then
+ SAMPLES_DIR="$(cd "$SAMPLES_RAW" && pwd)"
+else
+ SAMPLES_DIR="$SAMPLES_RAW"
+fi
+if [ ! -d "$SAMPLES_DIR" ]; then
+ echo "ERROR: sample documents not found at $SAMPLES_DIR" >&2
+ exit 2
+fi
+
+SPINE_BIN="${1:-}"
+if [ -z "$SPINE_BIN" ]; then
+ if [ -x "$SPINE_DIR/result/bin/spine" ]; then SPINE_BIN="$SPINE_DIR/result/bin/spine"
+ elif [ -x "$SPINE_DIR/bin/spine-ldc" ]; then SPINE_BIN="$SPINE_DIR/bin/spine-ldc"
+ elif [ -x "$SPINE_DIR/bin/spine" ]; then SPINE_BIN="$SPINE_DIR/bin/spine"
+ else
+ echo "ERROR: spine binary not found. Specify path as argument." >&2
+ exit 2
+ fi
+fi
+
+OUT_DIR="$SCRIPT_DIR/current-db-roundtrip"
+rm -rf "$OUT_DIR"
+mkdir -p "$OUT_DIR"
+
+echo "spine binary: $SPINE_BIN"
+echo "samples: $SAMPLES_DIR"
+echo "Generating .ssp and .abstraction.db ..."
+$SPINE_BIN --show-abstraction --show-abstraction-db --skip-output \
+ --output="$OUT_DIR" "$SAMPLES_DIR"/* 2>&1 | tail -1
+
+COUNT=0
+FAILURES=0
+for db in "$OUT_DIR"/*/abstraction/*.abstraction.db; do
+ [ -f "$db" ] || continue
+ ssp="${db%.abstraction.db}.ssp"
+ base=$(basename "$ssp")
+ COUNT=$((COUNT + 1))
+ if [ ! -f "$ssp" ]; then
+ echo "MISSING .ssp for $base"
+ FAILURES=$((FAILURES + 1))
+ continue
+ fi
+ if ! $SPINE_BIN --db-round-trip="$db" > "$OUT_DIR/from-db.ssp" 2> "$OUT_DIR/from-db.err"; then
+ echo "ERROR: $base (spine exited non-zero)"
+ head -3 "$OUT_DIR/from-db.err"
+ FAILURES=$((FAILURES + 1))
+ continue
+ fi
+ if ! cmp -s "$ssp" "$OUT_DIR/from-db.ssp"; then
+ echo "DIFFERS: $base ($(diff "$ssp" "$OUT_DIR/from-db.ssp" | grep -c '^[<>]') lines)"
+ diff --unified=1 "$ssp" "$OUT_DIR/from-db.ssp" | head -12
+ echo " ..."
+ FAILURES=$((FAILURES + 1))
+ fi
+done
+
+rm -rf "$OUT_DIR"
+
+if [ "$FAILURES" -eq 0 ]; then
+ echo "PASS: all $COUNT databases re-emit their document's .ssp exactly"
+ exit 0
+else
+ echo "FAIL: $FAILURES of $COUNT do not"
+ exit 1
+fi