-*- 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+ :eval never-export :exports code #+PROPERTY: header-args+ :noweb yes :padline no #+PROPERTY: header-args+ :results silent :cache no #+PROPERTY: header-args+ :mkdirp yes #+OPTIONS: H:3 num:nil toc:t \n:t ::t |:t ^:nil -:t f:t *:t - magic single double-quote → " ← FIX changes hilighting behavior (occuring after it) in org document. INVESTIGATE (org-mode CONFIG?) BUG, FIND & FIX * 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