From eabf1f6d74dac497ce31e3e2f441cfa25e9f74f2 Mon Sep 17 00:00:00 2001 From: "Douglas B. Rumbaugh" Date: Sat, 6 Jun 2026 12:02:41 -0400 Subject: Initial implementation (only a few years later!) This is pure Claude. I'd written out the plan for this suite of scripts eons ago, but never found the time to actual do it. Remembered it this morning, pointed Claude at the README, and had something that appears to work in minutes. caveat emptor: the design is mine, but the code is purely LLM generated at this point. --- tests/integration.sh | 123 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 123 insertions(+) create mode 100755 tests/integration.sh (limited to 'tests/integration.sh') diff --git a/tests/integration.sh b/tests/integration.sh new file mode 100755 index 0000000..ea847e4 --- /dev/null +++ b/tests/integration.sh @@ -0,0 +1,123 @@ +#!/bin/sh +# integration.sh - end-to-end test against a real LaTeX document +# +# Requires pdflatex and bibtex; skipped otherwise. Set BIBTEST_NET=1 to +# also exercise bib-fetch against doi.org (needs network access). + +ROOT=$(cd "$(dirname "$0")/.." && pwd) +PATH=$ROOT:$PATH +LSKEYS="awk -f $ROOT/lib/bib-parse.awk -f $ROOT/lib/bib-lskeys.awk" + +command -v pdflatex > /dev/null 2>&1 && command -v bibtex > /dev/null 2>&1 || { + printf 'integration: pdflatex/bibtex not found, skipping\n' >&2 + exit 0 +} + +tmpd=$(mktemp -d) || exit 1 +trap 'rm -rf "$tmpd"' EXIT INT TERM +cd "$tmpd" || exit 1 + +pass=0 +fail=0 +ok() { pass=$((pass + 1)); printf 'ok - %s\n' "$1"; } +not_ok() { fail=$((fail + 1)); printf 'FAIL - %s\n' "$1"; } + +# ---- build a database with bib-gen | bib-add --------------------------- +bib-gen -t article author='Donald E. Knuth' title='Literate Programming' \ + journal='The Computer Journal' year=1984 volume=27 number=2 \ + pages='97--111' | bib-add master.bib +bib-gen -t article author='Alan M. Turing' \ + title='Computing Machinery and Intelligence' journal='Mind' year=1950 \ + volume=59 pages='433--460' | bib-add master.bib +printf 'Claude E. Shannon\tA Mathematical Theory of Communication\tBell System Technical Journal\t1948 +Edsger W. Dijkstra\tGo To Statement Considered Harmful\tCommunications of the ACM\t1968 +' | bib-gen -F author,title,journal,year | bib-add master.bib + +n=$($LSKEYS master.bib | wc -l) +[ "$n" -eq 4 ] && ok "database built with 4 entries" \ + || not_ok "database built with 4 entries (got $n)" + +# ---- compile a document citing a subset -------------------------------- +cat > paper.tex <<'EOF' +\documentclass{article} +\begin{document} +Machines may think~\cite{turing1950computing}; programs are +literature~\cite{knuth1984literate}. + +DOI: 10.1093/comjnl/27.2.97 +\bibliographystyle{plain} +\bibliography{master} +\end{document} +EOF +pdflatex -interaction=batchmode paper.tex > /dev/null 2>&1 + +grep -q 'citation{turing1950computing}' paper.aux \ + && ok "pdflatex produced citations in aux" \ + || not_ok "pdflatex produced citations in aux" + +# ---- extract the cited subset and build against it --------------------- +bib-extract paper.aux master.bib > paper.bib +n=$($LSKEYS paper.bib | wc -l) +[ "$n" -eq 2 ] && ok "bib-extract kept the 2 cited entries" \ + || not_ok "bib-extract kept the 2 cited entries (got $n)" + +sed 's/\\bibdata{master}/\\bibdata{paper}/' paper.aux > tmp.aux \ + && mv tmp.aux paper.aux +bibtex paper > bibtex.log 2>&1 +grep -qi 'error\|warning' bibtex.log \ + && not_ok "bibtex accepts canonical output cleanly" \ + || ok "bibtex accepts canonical output cleanly" + +pdflatex -interaction=batchmode paper.tex > /dev/null 2>&1 +pdflatex -interaction=batchmode paper.tex > /dev/null 2>&1 +if grep -qi 'undefined' paper.log; then + not_ok "document resolves all citations" +else + ok "document resolves all citations" +fi +[ -s paper.pdf ] && ok "pdf produced" || not_ok "pdf produced" + +# ---- convert roundtrip -------------------------------------------------- +bib-convert master.bib | bib-convert > roundtrip.bib +if [ "$($LSKEYS master.bib | sort)" = "$($LSKEYS roundtrip.bib | sort)" ]; then + ok "bibtex -> refer -> bibtex preserves all keys" +else + not_ok "bibtex -> refer -> bibtex preserves all keys" +fi + +# ---- bib-fetch against the built pdf (network) -------------------------- +if [ "$BIBTEST_NET" = 1 ]; then + if bib-fetch paper.pdf > fetched.bib 2> /dev/null; then + grep -q '^@article{knuth1984literate,' fetched.bib \ + && ok "bib-fetch resolves DOI from built pdf" \ + || not_ok "bib-fetch resolves DOI from built pdf" + if bib-fetch paper.pdf 2> /dev/null | bib-add master.bib 2> /dev/null; then + not_ok "fetched entry detected as duplicate" + else + ok "fetched entry detected as duplicate" + fi + else + not_ok "bib-fetch resolves DOI from built pdf" + fi + bib-fetch -a 1706.03762 2> /dev/null \ + | grep -q '^@misc{vaswani[0-9]*attention,' \ + && ok "bib-fetch resolves arXiv id" \ + || not_ok "bib-fetch resolves arXiv id" + cat > arx.tex <<'EOF' +\documentclass{article} +\begin{document} +A preprint without any DOI. + +arXiv:1706.03762v7 [cs.CL] 2 Aug 2023 +\end{document} +EOF + pdflatex -interaction=batchmode arx.tex > /dev/null 2>&1 + bib-fetch arx.pdf 2> /dev/null | grep -q 'eprint = {1706.03762}' \ + && ok "bib-fetch extracts arXiv id from pdf" \ + || not_ok "bib-fetch extracts arXiv id from pdf" +else + printf 'skip - bib-fetch network tests (set BIBTEST_NET=1 to enable)\n' +fi + +printf '\n%d passed, %d failed\n' "$pass" "$fail" +[ "$fail" -eq 0 ] -- cgit v1.2.3