#!/bin/sh
# Check GNU m4 against examples from the manual source.
# Copyright (C) 1992, 2006 Free Software Foundation, Inc.

# Sanity check what we are testing
m4 --version

# Clean up temp files on exit
pwd=`pwd`
tmp=m4-tmp.$$
trap 'stat=$?; cd $pwd; rm -rf $tmp && exit $stat' 0
trap '(exit $?); exit $?' 1 2 13 15

# Create scratch dir
framework_failure=0
mkdir $tmp || framework_failure=1

if test $framework_failure = 1; then
  echo "$0: failure in testing framework" 1>&2
  (exit 1); exit 1
fi

out=$tmp/m4-out
err=$tmp/m4-err
xout=$tmp/m4-xout
xerr=$tmp/m4-xerr
failed=
skipped=

# Find out how the executable prints argv[0]
m4=`m4 --help | sed -e 's/Usage: \(.*\) \[OPTION.*/\1/' \
    -e 's/\\\\/\\\\\\\\/g' -e 1q`

# Find out where the examples live.
examples=.
if test "x$1" = x-I ; then
  examples="$2"
  shift; shift
fi

# Run the tests.
for file
do
  test -f "$file" || {
    echo "No such file: $file"
    continue
  }
  echo "Checking $file"
  sed -e '/^dnl @/d' -e '/^\^D$/q' "$file" \
    | LC_MESSAGES=C m4 -d -I "$examples" - >$out 2>$err

  if test $? = 77 ; then
    skipped="$skipped $file"
    cat $err
    continue
  fi

  sed -e '/^dnl @result{}/!d' -e 's///' -e "s|\.\./examples|$examples|" \
    "$file" > $xout

  if cmp -s $out $xout; then
    :
  else
    failed="$failed $file:out"
    echo `sed -e 's/^dnl //' -e 1q $file`
    echo "$file: stdout mismatch"
    diff $xout $out
  fi

  sed -e '/^dnl @error{}/!d' -e 's///' -e "s|^m4:|$m4:|" "$file" > $xerr

  if cmp -s $err $xerr; then
    :
  else
    failed="$failed $file:err"
    echo `sed -e 's/^dnl //' -e 1q $file`
    echo "$file: stderr mismatch"
    diff $xerr $err
  fi

done

rm -f $out $err $xout $xerr

echo
if test -n "$skipped"; then
  echo "Skipped checks were:"
  echo " $skipped"
fi
if test -z "$failed"; then
  echo "All checks successful"
  stat=0
else
  echo "Failed checks were:"
  echo " $failed"
  stat=1
fi
(exit $stat); exit $stat
