#!/bin/sh
# compara: el lenguaje de calcula (src/lexico.c con slex, src/psi_yacc.y con
# Bison) sobre las entradas de entradas/, leidas como archivo y por la
# entrada estandar, contra lo de esperado/. Estado 0 si todas dan igual.
#
#     tests/lenguaje/compara CALCULA            compara
#     tests/lenguaje/compara CALCULA --congela  guarda lo que da hoy
#
# CALCULA es el programa a probar; los modulos (libcalcula-psicro.so...) los
# busca por LD_LIBRARY_PATH y los sistemas en ../../sistemas.
aqui=$(cd "$(dirname "$0")" && pwd)
calcula=${1:?uso: compara CALCULA [--congela]}
export CALCULA_SISTEMAS="$aqui/../../sistemas"
fallan=0; n=0
for e in "$aqui"/entradas/*; do
  b=$(basename "$e"); n=$((n + 1))
  sal=$(mktemp)
  { echo "== como archivo"; timeout 30 "$calcula" -s psicro "$e" 2>&1; echo "estado $?"
    echo "== por la entrada estandar"; timeout 30 "$calcula" -s psicro < "$e" 2>&1; echo "estado $?"; } > "$sal"
  if [ "$2" = --congela ]; then cp "$sal" "$aqui/esperado/$b"
  elif cmp -s "$sal" "$aqui/esperado/$b"; then echo "  ok    $b"
  else echo "  FALLA $b"; diff "$aqui/esperado/$b" "$sal" | head -10 | sed 's/^/        /'; fallan=$((fallan + 1)); fi
  rm -f "$sal"
done
[ "$2" = --congela ] && { echo "$n congeladas"; exit 0; }
echo "$n entradas, $fallan distintas de lo esperado"
[ $fallan -eq 0 ]
