Files
intellijai/jaitest
hgranthorner 086ae993c5 Parser: corpus parse rate 69% -> 81%, and stop --tests from sticking
Grammar: 'using,except(x)' modifiers, '#ifx' with block branches, unions with
parameters, multi-value initializers, mixed 'name:, lvalue = call()' targets,
'push_context' with no explicit context, 'operator []=', '#foreign lib "symbol"',
keyword-named arguments such as 'remove={...}', and '#insert (options) body'.
Directive flags now require adjacency: without it, in
'(callback: (*GUID) #c_call, lpContext: *void)' the flag swallowed ', lpContext'.

procModifier is now just directiveExpr — one rule for directives in both
positions, so fixes apply everywhere.

jaitest: a '--tests' filter persisted through Gradle's configuration cache, so a
later unfiltered ./jaitest silently re-ran only that class and printed OK.
Unfiltered runs now disable the configuration cache.

MIN_CLEAN_FILES ratchets the corpus gate at 575/714.
2026-08-04 12:20:36 -04:00

84 lines
2.9 KiB
Bash
Executable File

#!/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.
#
# A `--tests` filter STICKS: Gradle reuses the configuration cache entry from the
# previous run, so a later unfiltered `./jaitest` silently re-runs just that one
# class and reports OK. Unfiltered runs therefore disable the configuration cache,
# which is the only reliable way to get the whole suite back.
#
# Usage: ./jaitest [gradle args...] e.g. ./jaitest --tests '*Lexer*'
set -uo pipefail
cd "$(dirname "$0")" || exit 1
extra=()
if [[ " $* " != *" --tests "* ]]; then
extra+=(--no-configuration-cache)
fi
run_gradle() {
rm -rf build/reports/tests/test
./jaigradle cleanTest test "${extra[@]}" "$@" 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."
echo
echo "If Gradle reported ':test NO-SOURCE' while the sources clearly exist, the"
echo "build cache holds a poisoned entry with empty compileTestKotlin outputs"
echo "(a concurrent build had its outputs deleted mid-run). Recover with:"
echo
echo " ./jaigradle --stop"
echo " rm -rf build .gradle ~/.gradle/caches/build-cache-1"
echo " ./jaitest"
exit 1
fi
total=0
bad=0
for f in "${xml[@]}"; do
line=$(sed -n '2p' "$f")
name=$(sed -nE 's/^<testsuite name="([^"]*)".*/\1/p' <<<"$line")
t=$(sed -nE 's/.*tests="([0-9]*)".*/\1/p' <<<"$line")
fa=$(sed -nE 's/.*failures="([0-9]*)".*/\1/p' <<<"$line")
er=$(sed -nE 's/.*errors="([0-9]*)".*/\1/p' <<<"$line")
sk=$(sed -nE 's/.*skipped="([0-9]*)".*/\1/p' <<<"$line")
printf '%-60s tests=%s skipped=%s failures=%s errors=%s\n' "$name" "$t" "$sk" "$fa" "$er"
total=$((total + t))
bad=$((bad + fa + er))
if [ "$fa" != "0" ] || [ "$er" != "0" ]; then
grep -E '<(failure|error) ' "$f" | head -40
fi
done
echo "--- total tests=$total failures+errors=$bad gradle_exit=$gradle_status"
if [ "$total" -eq 0 ] || [ "$bad" -ne 0 ] || [ "$gradle_status" -ne 0 ]; then
exit 1
fi
echo "OK"