T05 — ride_accumulator.dart with the cross-batch anchor intact (12 tests). T06 — ride_export.dart, GPX 1.1 and GeoJSON (15 tests), parsed with real parsers rather than substring matching. T07 — parity harness extended to cover export byte output. GPX and GeoJSON are byte-identical across Kotlin and Dart: same length, same FNV hash, including the escaped hostile name and all %.7f/%.1f formatting. Two harness bugs found and fixed while building it. String.hashCode is not comparable across Java and Dart, so text comparison used FNV-1a instead. And a missing jar let a failed Kotlin compile pass as a green run -- run.sh now checks for the artifact and exits non-zero, the same failure mode as the v2 sweep that hid a compile error behind /dev/null. Phase 1 done: 79 tests passing, analyze clean. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
61 lines
2.5 KiB
Bash
Executable File
61 lines
2.5 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
# Cross-language parity harness (T07).
|
|
#
|
|
# Drives the SAME fixtures through the native Kotlin implementation and the Dart port,
|
|
# and diffs the output. This is the port's strongest correctness guarantee: it proved the
|
|
# elevation accumulator is bit-identical across both languages.
|
|
#
|
|
# Requires: kotlinc (brew install kotlin) and a JDK 17-21.
|
|
#
|
|
# NOTE: never redirect the build to /dev/null. A v2 sweep once returned four identical
|
|
# results because a quoting bug corrupted the source while the compile error hid behind
|
|
# a redirect. If every value looks suspiciously equal, suspect the harness first.
|
|
set -euo pipefail
|
|
|
|
HERE="$(cd "$(dirname "$0")" && pwd)"
|
|
NATIVE="${RIPPR_NATIVE:-$HOME/dojo/rippr}"
|
|
WORK="$(mktemp -d)"
|
|
trap 'rm -rf "$WORK"' EXIT
|
|
|
|
if [ ! -d "$NATIVE" ]; then
|
|
echo "Native repo not found at $NATIVE. Set RIPPR_NATIVE." >&2
|
|
exit 1
|
|
fi
|
|
|
|
# The files actually under test are copied verbatim from the native repo — never
|
|
# reimplemented. Only the Room-annotated holders and one Telemetry constant are stubbed,
|
|
# so the algorithm files compile without androidx or org.json on the classpath.
|
|
cp "$NATIVE/app/src/main/java/com/rippr/geo/Geo.kt" "$WORK/"
|
|
cp "$NATIVE/app/src/main/java/com/rippr/stats/RideStatistics.kt" "$WORK/"
|
|
cp "$NATIVE/app/src/main/java/com/rippr/export/RideExport.kt" "$WORK/"
|
|
cp "$HERE/stubs.kt" "$HERE/telemetry_stub.kt" "$HERE/main.kt" "$WORK/"
|
|
|
|
echo "== compiling Kotlin oracle =="
|
|
( cd "$WORK" && kotlinc Geo.kt RideStatistics.kt RideExport.kt stubs.kt \
|
|
telemetry_stub.kt main.kt -include-runtime -d parity.jar 2>&1 \
|
|
| grep -v '^warning:' || true )
|
|
|
|
# A missing jar means compilation failed. Never let that pass as a green run -- a v2
|
|
# sweep hid exactly this behind a redirect and reported four identical results.
|
|
if [ ! -f "$WORK/parity.jar" ]; then
|
|
echo "Kotlin oracle failed to compile (see errors above)." >&2
|
|
exit 1
|
|
fi
|
|
|
|
JAVA_BIN="${JAVA_HOME:+$JAVA_HOME/bin/}java"
|
|
"$JAVA_BIN" -jar "$WORK/parity.jar" | grep '=' | sort > "$WORK/kotlin.txt"
|
|
|
|
echo "== running Dart side =="
|
|
( cd "$HERE/../.." && dart run tool/parity/probe.dart ) | grep '=' | sort > "$WORK/dart.txt"
|
|
|
|
echo "== diff =="
|
|
if diff -u "$WORK/kotlin.txt" "$WORK/dart.txt"; then
|
|
echo "PARITY OK - byte-identical on every key"
|
|
else
|
|
echo
|
|
echo "Differences above. Expected and accepted: run_avg_speed and any other"
|
|
echo "speed-derived value, where Kotlin's 32-bit Float widens to double with"
|
|
echo "artefacts Dart's uniform binary64 does not reproduce. Anything else is a bug."
|
|
exit 1
|
|
fi
|