diff options
| author | Ralph Amissah <ralph.amissah@gmail.com> | 2026-04-22 20:25:38 -0400 |
|---|---|---|
| committer | Ralph Amissah <ralph.amissah@gmail.com> | 2026-04-22 22:10:49 -0400 |
| commit | 3e60254927f7b7bc271586146f9f49dc756b4027 (patch) | |
| tree | e42b375df1bc8b0a723f040a61afe5e182064501 /org/test_shell_script_ssp_document_abstraction.org | |
| parent | add 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.org | 155 |
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 + |
