@@ -56,6 +56,7 @@ extras pull in everything the suite needs:
```
pip install -e ".[tests]"
+tests/run-tests.sh
```
See [tests/docs/](tests/docs/) for how to run the suite and the
new file mode 100755
@@ -0,0 +1,75 @@
+#!/usr/bin/env bash
+#
+# Run the wic test suite.
+#
+# Thin wrapper around pytest that works from anywhere in the checkout:
+# it locates the repository root, makes sure the interpreter can import
+# wic, and then hands off to pytest.
+#
+# Needs the test extras: pip install -e ".[tests]"
+
+set -euo pipefail
+
+usage() {
+ cat <<'USAGE'
+Usage:
+ tests/run-tests.sh [pytest args]
+
+Options:
+ -h, --help show this help and exit
+
+Anything else is passed straight through to pytest (for example a
+path, -k EXPR, or -v). With no such argument the whole suite under
+tests/ is run.
+
+Examples:
+ tests/run-tests.sh # whole suite
+ tests/run-tests.sh -k filemap -v # pass args through to pytest
+ tests/run-tests.sh tests/unit # a single tier or file
+
+Needs the test extras: pip install -e ".[tests]"
+USAGE
+}
+
+REPO_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
+PY="${PYTHON:-python3}"
+
+pytest_args=()
+while [ $# -gt 0 ]; do
+ case "$1" in
+ -h|--help)
+ usage
+ exit 0
+ ;;
+ --)
+ shift
+ pytest_args+=("$@")
+ break
+ ;;
+ *)
+ pytest_args+=("$1")
+ ;;
+ esac
+ shift
+done
+
+cd "$REPO_ROOT"
+
+# Make sure the interpreter that will run pytest can actually import wic.
+# The suites pass even without an install (each adds src/ to sys.path),
+# but the session banner and any install-dependent behaviour would be
+# wrong, so fail loudly instead of running against the wrong interpreter.
+if ! "$PY" -c "import wic" >/dev/null 2>&1; then
+ echo "error: '$PY' cannot import wic." >&2
+ echo " install wic with its test extras:" >&2
+ echo " $PY -m pip install -e \".[tests]\"" >&2
+ exit 1
+fi
+
+# Default target: the whole suite. Overridden if the caller passed a
+# path or -k/-m selector to pytest.
+if [ ${#pytest_args[@]} -eq 0 ]; then
+ pytest_args=("tests")
+fi
+
+exec "$PY" -m pytest "${pytest_args[@]}"
The suite is run with pytest, but invoking pytest directly has two sharp edges: it must be run from the right directory for the pyproject configuration to apply, and it happily runs against whatever Python happens to be first on PATH, even one that cannot import wic. A run against the wrong interpreter produces a misleading banner and, worse, can silently exercise a different wic than the one in the checkout. This commit adds tests/run-tests.sh, a thin wrapper that removes both hazards: - it locates the repository root from its own path and changes there before running, so it works regardless of the caller's directory; - it checks that the interpreter can import wic before handing off to pytest, and fails loudly with the install command if it cannot; - with no arguments it runs the whole suite under tests/; any argument it does not recognise (a path, -k EXPR, -v, ...) is passed straight through to pytest, and an explicit -- forwards everything after it. The interpreter can be overridden with the PYTHON environment variable (default python3). -h/--help prints usage and exits. The README Testing section gains the run-tests.sh invocation alongside the install step. AI-Generated: codex/claude-opus 4.7 (xhigh) Signed-off-by: Trevor Woerner <twoerner@gmail.com> --- changes in v2: - v1 submitted the entire test suite as a single commit; v2 breaks the work into a reviewable series, and this patch is one step of it. --- README.md | 1 + tests/run-tests.sh | 75 ++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 76 insertions(+) create mode 100755 tests/run-tests.sh