aboutsummaryrefslogtreecommitdiffhomepage
path: root/org/test_shell_script_ssp_document_abstraction.org
diff options
context:
space:
mode:
authorRalph Amissah <ralph.amissah@gmail.com>2026-04-22 20:25:38 -0400
committerRalph Amissah <ralph.amissah@gmail.com>2026-04-22 22:10:49 -0400
commit3e60254927f7b7bc271586146f9f49dc756b4027 (patch)
treee42b375df1bc8b0a723f040a61afe5e182064501 /org/test_shell_script_ssp_document_abstraction.org
parentadd children_headings to document abstraction (diff)
add .ssp regression test script and reference files
test/test-abstraction-ssp.sh: shell script that generates .ssp files for all sample documents and diffs against committed reference files in test/reference/abstraction/. Usage: ./test/test-abstraction-ssp.sh --generate ./bin/spine-ldc ./test/test-abstraction-ssp.sh ./bin/spine-ldc Exits 0 if all .ssp files match, 1 if differences found. Reports changed, missing, and new files. test/reference/abstraction/: 35 reference .ssp files generated from the current abstraction, covering all sample documents including 9-language live-manual. Co-Authored-By: Anthropic Claude Opus 4.6 (1M context)
Diffstat (limited to 'org/test_shell_script_ssp_document_abstraction.org')
-rw-r--r--org/test_shell_script_ssp_document_abstraction.org155
1 files changed, 155 insertions, 0 deletions
diff --git a/org/test_shell_script_ssp_document_abstraction.org b/org/test_shell_script_ssp_document_abstraction.org
new file mode 100644
index 0000000..5d25f5b
--- /dev/null
+++ b/org/test_shell_script_ssp_document_abstraction.org
@@ -0,0 +1,155 @@
+-*- mode: org -*-
+#+TITLE: test shell script ssp document abstraction
+#+DESCRIPTION: env envrc used by make & nix
+#+FILETAGS: :spine:build:tools:
+#+AUTHOR: Ralph Amissah
+#+EMAIL: [[mailto:ralph.amissah@gmail.com][ralph.amissah@gmail.com]]
+#+COPYRIGHT: Copyright (C) 2015 (continuously updated, current 2026) Ralph Amissah
+#+LANGUAGE: en
+#+STARTUP: content hideblocks hidestars noindent entitiespretty
+#+PROPERTY: header-args :exports code
+#+PROPERTY: header-args+ :noweb yes
+#+PROPERTY: header-args+ :results silent
+#+PROPERTY: header-args+ :cache no
+#+PROPERTY: header-args+ :padline no
+#+PROPERTY: header-args+ :mkdirp yes
+#+OPTIONS: H:3 num:nil toc:t \n:t ::t |:t ^:nil -:t f:t *:t
+
+* test shell script ssp document abstraction test/test-abstraction-ssp.sh
+
+#+HEADER: :tangle ../test/test-abstraction-ssp.sh
+#+HEADER: :tangle-mode (identity #o755)
+#+HEADER: :shebang "#!/usr/bin/env sh"
+#+BEGIN_SRC shell
+# test-abstraction-ssp.sh
+#
+# Regression test for spine's document abstraction.
+# Generates .ssp files for all sample documents and diffs
+# against committed reference files.
+#
+# Usage:
+# ./test/test-abstraction-ssp.sh # uses result/bin/spine
+# ./test/test-abstraction-ssp.sh ./bin/spine-ldc # specify binary
+#
+# Exit codes:
+# 0 all .ssp files match reference
+# 1 differences found (printed to stdout)
+# 2 missing reference directory (run with --generate first)
+#
+# To generate/update reference files:
+# ./test/test-abstraction-ssp.sh --generate
+# ./test/test-abstraction-ssp.sh --generate ./bin/spine-ldc
+
+set -e
+
+SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
+SPINE_DIR="$(cd "$SCRIPT_DIR/.." && pwd)"
+SAMPLES_DIR="$SPINE_DIR/../sisudoc-spine-samples/markup/pod-samples/pod"
+REF_DIR="$SCRIPT_DIR/reference/abstraction"
+TMP_DIR="$SCRIPT_DIR/current/abstraction"
+
+# parse arguments
+GENERATE=false
+SPINE_BIN=""
+for arg in "$@"; do
+ case "$arg" in
+ --generate) GENERATE=true ;;
+ *) SPINE_BIN="$arg" ;;
+ esac
+done
+
+# find spine binary
+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
+
+# check samples exist
+if [ ! -d "$SAMPLES_DIR" ]; then
+ echo "ERROR: sample documents not found at $SAMPLES_DIR" >&2
+ exit 2
+fi
+
+echo "spine binary: $SPINE_BIN"
+echo "samples: $SAMPLES_DIR"
+
+if [ "$GENERATE" = true ]; then
+ echo "Generating reference .ssp files..."
+ rm -rf "$REF_DIR"
+ mkdir -p "$REF_DIR"
+ $SPINE_BIN --show-abstraction --skip-output --output="$SCRIPT_DIR/reference" "$SAMPLES_DIR"/* 2>&1 | tail -1
+ # flatten language subdirs into reference dir
+ find "$SCRIPT_DIR/reference" -name "*.ssp" ! -path "$REF_DIR/*" -exec mv {} "$REF_DIR/" \;
+ # clean up empty language dirs
+ find "$SCRIPT_DIR/reference" -mindepth 1 -type d -empty -delete 2>/dev/null || true
+ COUNT=$(ls "$REF_DIR"/*.ssp 2>/dev/null | wc -l)
+ echo "Generated $COUNT reference .ssp files in $REF_DIR"
+ exit 0
+fi
+
+# check reference exists
+if [ ! -d "$REF_DIR" ] || [ -z "$(ls "$REF_DIR"/*.ssp 2>/dev/null)" ]; then
+ echo "ERROR: no reference files found at $REF_DIR" >&2
+ echo "Run with --generate first to create reference files." >&2
+ exit 2
+fi
+
+# generate current .ssp files
+echo "Generating current .ssp files..."
+rm -rf "$TMP_DIR"
+mkdir -p "$TMP_DIR"
+$SPINE_BIN --show-abstraction --skip-output --output="$SCRIPT_DIR/current" "$SAMPLES_DIR"/* 2>&1 | tail -1
+# flatten
+find "$SCRIPT_DIR/current" -name "*.ssp" ! -path "$TMP_DIR/*" -exec mv {} "$TMP_DIR/" \;
+find "$SCRIPT_DIR/current" -mindepth 1 -type d -empty -delete 2>/dev/null || true
+
+# diff
+echo "Comparing against reference..."
+FAILURES=0
+for ref_file in "$REF_DIR"/*.ssp; do
+ basename=$(basename "$ref_file")
+ cur_file="$TMP_DIR/$basename"
+ if [ ! -f "$cur_file" ]; then
+ echo "MISSING: $basename (in reference but not generated)"
+ FAILURES=$((FAILURES + 1))
+ continue
+ fi
+ if ! diff -q "$ref_file" "$cur_file" > /dev/null 2>&1; then
+ echo "CHANGED: $basename"
+ diff --unified=3 "$ref_file" "$cur_file" | head -30
+ echo " ..."
+ FAILURES=$((FAILURES + 1))
+ fi
+done
+
+# check for new files not in reference
+for cur_file in "$TMP_DIR"/*.ssp; do
+ basename=$(basename "$cur_file")
+ ref_file="$REF_DIR/$basename"
+ if [ ! -f "$ref_file" ]; then
+ echo "NEW: $basename (generated but not in reference)"
+ FAILURES=$((FAILURES + 1))
+ fi
+done
+
+# clean up
+rm -rf "$SCRIPT_DIR/current"
+
+if [ "$FAILURES" -eq 0 ]; then
+ REF_COUNT=$(ls "$REF_DIR"/*.ssp | wc -l)
+ echo "PASS: all $REF_COUNT .ssp files match reference"
+ exit 0
+else
+ echo "FAIL: $FAILURES difference(s) found"
+ exit 1
+fi
+#+END_SRC
+