#!/usr/bin/env bash # Run the test suite and report the JUnit XML, not just the exit code. # # A green `test` task does not prove tests ran (see AGENTS.md), so this always # prints tests/failures/errors per suite and dumps failure messages. # # Two concurrent Gradle invocations (e.g. an editor/agent running tests in the # background at the same time) fight over build/test-results and the loser dies # with `java.io.EOFException` or a missing in-progress-results bin. That is an # infrastructure failure, not a test failure, so it is retried once. # # Usage: ./jaitest [gradle args...] e.g. ./jaitest --tests '*Lexer*' set -uo pipefail cd "$(dirname "$0")" || exit 1 run_gradle() { rm -rf build/reports/tests/test ./jaigradle cleanTest test "$@" 2>&1 | grep -vE '^\[[0-9.]+s\]\[warning\]\[cds\]' return "${PIPESTATUS[0]}" } run_gradle "$@" gradle_status=$? shopt -s nullglob xml=(build/test-results/test/*.xml) if [ "$gradle_status" -ne 0 ] && [ ${#xml[@]} -eq 0 ]; then echo echo "!!! no test XML and a failed build — retrying once (concurrent Gradle run?)" sleep 3 run_gradle "$@" gradle_status=$? xml=(build/test-results/test/*.xml) fi echo echo "=== JUnit XML ===" if [ ${#xml[@]} -eq 0 ]; then echo "NO TEST XML PRODUCED — tests did not run." exit 1 fi total=0 bad=0 for f in "${xml[@]}"; do line=$(sed -n '2p' "$f") name=$(sed -nE 's/^