#/bin/sh

# Compare the output of ../src/indent to correct output
# generated by earlier versions

INDENT=../src/indent

# First, make sure the executable exists

if test -x $INDENT; then
  if test -d ./output; then
    echo '****'
    echo 'Errors remain; output directory still exists'
    echo '****'
    ls -ld ./output
    exit 1
  fi
  echo -n "Regression testing "
  $INDENT --version
  echo
else
  echo '****'
  echo First, you must make $INDENT
  echo '****'
  echo
  exit 1
fi


# Code to be tested with default options

EXAMPLES="do.c else.c for.c func-def.c lshift.c ncs.c \
        proto.c typedef.h no-newline.c emacs-compatible.h fp.c unary.c \
        struct_param.c no-newline2.c no-newline3.c wide.c"

BUGS="case-label.c one-line-1.c one-line-2.c one-line-3.c \
        one-line-4.c struct-decl.c sizeof-in-while.c line-break-comment.c \
        macro.c enum.c elif.c nested.c wrapped-string.c"

INDENTSRC="args.c backup.h backup.c dirent_def.h globs.c indent.h \
        indent.c indent_globs.h io.c lexi.c memcpy.c parse.c pr_comment.c \
        sys.h version.h"

mkdir output

echo -n "Generating indent et al with default settings..."

for i in $EXAMPLES $INDENTSRC $BUGS
do
    $INDENT -npro $i -o output/$i
done
echo "Done."


# Cases testing certain options
echo -n "Generating special option examples..."

SPECIALS="typedef-bug.c bug-hp.c bug-di.c newlined-parms.c indent.pro.c \
        comments1.c comments1-fca.c ncs-on-return.c sob.c continue.c continue-lp.c \
        kr.c struct-decl-kr.c embedded-cuddle1.c embedded-cuddle2.c kr-proc-decls.c \
        bbb-test.c preesc-comment.c if-decl-else-decl.c cp-indent.c comments.c \
        elipsis-attribute.c comments2.c comments3.c comments4.c brackets.c brackets33.c \
        brackets34.c brackets35.c brackets36.c brackets37.c brackets38.c \
        initializers.c else-if.c else-comment-br.c else-comment-bl.c \
        else-comment-br-ce.c const.c case.c case-br.c scope.c scope-br.c \
        comment-break.c cdb.c bbreak.c bad-break.c dont-line-up-parentheses.c \
        bad-comment.c unknown-type.c unknown-type-npsl.c bug-npsl.c bug-psl.c"

ARGS="-bad"
$INDENT -npro $ARGS bad-break.c -o output/bad-break.c
$INDENT -npro $ARGS bad-comment.c -o output/bad-comment.c

ARGS="-cdb"
$INDENT -npro $ARGS cdb.c -o output/cdb.c

ARGS="-kr"
$INDENT -npro $ARGS kr.c -o output/kr.c
$INDENT -npro $ARGS struct-decl.c -o output/struct-decl-kr.c
$INDENT -npro $ARGS embedded-cuddle1.c -o output/embedded-cuddle1.c
$INDENT -npro $ARGS embedded-cuddle2.c -o output/embedded-cuddle2.c
$INDENT -npro $ARGS kr-proc-decls.c -o output/kr-proc-decls.c

ARGS="-cli23 -bli8 -di50 -cbi1 -ci7 -i5"
$INDENT -npro $ARGS case.c -o output/case.c
$INDENT -npro $ARGS -br case.c -o output/case-br.c
$INDENT -npro $ARGS scope.c -o output/scope.c
$INDENT -npro $ARGS -br scope.c -o output/scope-br.c

ARGS="-nlp -ci3 -fca"
$INDENT -npro $ARGS continue.c -o output/continue.c
ARGS="-lp"
$INDENT -npro $ARGS continue.c -o output/continue-lp.c

ARGS="-sob"
$INDENT -npro $ARGS sob.c -o output/sob.c

ARGS="-ncs -TUNCH"
$INDENT -npro $ARGS typedef-bug.c -o output/typedef-bug.c
$INDENT -npro $ARGS ncs-on-return.c -o output/ncs-on-return.c

ARGS="-kr -i2"
$INDENT -npro $ARGS bug-hp.c -o output/bug-hp.c

ARGS="-orig"
$INDENT -npro $ARGS bug-di.c -o output/bug-di.c
$INDENT -npro $ARGS newlined-parms.c -o output/newlined-parms.c

ARGS="-bad -bap -nbc -bl -c36 -cd36 -ncdb -nce -ci8 -cli0 -cs -d0 \
-di1 -nfca -i2 -ip0 -l80 -nlp -npcs -npsl -nsc -nsob -ss -nv"
$INDENT -npro $ARGS indent.pro.c -o output/indent.pro.c

ARGS="-fca"
$INDENT -npro $ARGS comments1.c -o output/comments1-fca.c

ARGS="-bbb"
$INDENT -npro $ARGS bbb-test.c -o output/bbb-test.c

$INDENT -npro comments1.c -o output/comments1.c
$INDENT -npro unknown-type.c -o output/unknown-type.c

$INDENT -npro preesc-comment.c -o output/preesc-comment.c

ARGS="-npsl"
$INDENT -npro $ARGS if-decl-else-decl.c -o output/if-decl-else-decl.c
$INDENT -npro $ARGS unknown-type.c -o output/unknown-type-npsl.c
$INDENT -npro $ARGS bug-npsl.c -o output/bug-npsl.c
$INDENT -npro bug-npsl.c -o output/bug-psl.c

ARGS="-cp9"
$INDENT -npro $ARGS cp-indent.c -o output/cp-indent.c

ARGS="-di7"
$INDENT -npro $ARGS comments.c -o output/comments.c

ARGS="-ci5 -T aClient"
$INDENT -npro $ARGS elipsis-attribute.c -o output/elipsis-attribute.c

ARGS="-npsl -npcs -di3"
$INDENT -npro $ARGS comments2.c -o output/comments2.c
$INDENT -npro $ARGS comments3.c -o output/comments3.c

ARGS="-cdb -sc"
$INDENT -npro $ARGS comments4.c -o output/comments4.c

$INDENT -npro brackets.c -o output/brackets.c
$INDENT -npro --line-length33 brackets.c -o output/brackets33.c
$INDENT -npro --line-length34 brackets.c -o output/brackets34.c
$INDENT -npro --line-length35 brackets.c -o output/brackets35.c
$INDENT -npro --line-length36 brackets.c -o output/brackets36.c
$INDENT -npro --line-length37 brackets.c -o output/brackets37.c
$INDENT -npro --line-length38 brackets.c -o output/brackets38.c

$INDENT -npro --line-length40 bbreak.c -o output/bbreak.c

ARGS="-ci5"
$INDENT -npro $ARGS initializers.c -o output/initializers.c

ARGS="-nhnl --brace-indent0 --indent-level2 --dont-line-up-parentheses --continuation-indentation4 --paren-indentation0 --line-length80"
$INDENT -npro $ARGS else-if.c -o output/else-if.c

ARGS=""
$INDENT -npro -bl else-comment.c -o output/else-comment-bl.c
$INDENT -npro -br else-comment.c -o output/else-comment-br.c
$INDENT -npro -br -ce else-comment.c -o output/else-comment-br-ce.c

ARGS="-kr -cp0 -l132 -lps -br -psl"
$INDENT -npro $ARGS const.c -o output/const.c

ARGS="--dont-break-procedure-type --ignore-newlines"
$INDENT -npro $ARGS comment-break.c -o output/comment-break.c

ARGS="-i4 -l100 -nlp"
$INDENT -npro $ARGS dont-line-up-parentheses.c -o output/dont-line-up-parentheses.c

# Check line counting of input file
$INDENT -npro line-count.c -o /dev/null 2>&1 | cut -d: -f3 > output/line-count.c

echo "Done."

ERR=output/errors

# Now diff all the new files with the old standard
echo
echo "Diffing generated code against standard..."

for i in $EXAMPLES $INDENTSRC $SPECIALS $BUGS; do
  echo -n ...$i...
  diff --initial-tab standard/$i output/$i > output/$i-diffs 2>&1
  if [ -s output/$i-diffs ]; then
    echo -n ERROR: $i failed | tee -a $ERR
  else
    rm output/$i-diffs
  fi
  echo
done
echo "Diffing generated code against standard...Done."

# Testing indent (x) == indent (indent (x))
echo
echo -n "Testing meta-indent..."

ARGS="-bacc -nbad -nbap -nbc -br -cdb -nce -ci4 -cli4 -cs -nfc1 \
-fca -i4 -ip0 -l78 -lp -npcs -psl -sc -ss -ts4"
$INDENT -npro $ARGS meta-indent.c -o output/meta-indent.c-1
diff --initial-tab output/meta-indent.c-1 standard/meta-indent.c > output/meta-diffs
if [ -s output/meta-diffs ]; then
  echo ERROR: 1st Meta test failed | tee -a $ERR
else
  rm output/meta-diffs
fi

for j in 1 2 3 4 5; do
  i=`expr $j + 1`
  $INDENT -npro $ARGS output/meta-indent.c-$j -o output/meta-indent.c-$i
  diff --initial-tab output/meta-indent.c-$j output/meta-indent.c-$i > output/meta-diffs-$j-$i
  if [ -s output/meta-diffs-$j-$i ]; then
    echo ERROR: Meta test $i failed | tee -a $ERR
  else
    rm output/meta-diffs-$j-$i
fi
done
echo "Done"



# This section was added when `pr_comment.c' was rewritten, to test
# the new comment-handling code.

echo
echo Testing new comment stuff...

A1="-fca"
A2="-fc1"
A3="-fca -fc1"
A4="-fca -fc1 -cdb"
A5="-fca -fc1 -cdb -sc"
A6="-fca -fc1 -sc"
A7="-sc -fc1"
A8="-cdb -fc1"
A9="-sc -cdb -fc1"
A10="-sc -cdb"

$INDENT -npro -st boxed.c > output/boxed.c-0
$INDENT -npro -st $A1 boxed.c > output/boxed.c-1
$INDENT -npro -st $A2 boxed.c > output/boxed.c-2
$INDENT -npro -st $A3 boxed.c > output/boxed.c-3
$INDENT -npro -st $A4 boxed.c > output/boxed.c-4
$INDENT -npro -st $A5 boxed.c > output/boxed.c-5
$INDENT -npro -st $A6 boxed.c > output/boxed.c-6
$INDENT -npro -st $A7 boxed.c > output/boxed.c-7
$INDENT -npro -st $A8 boxed.c > output/boxed.c-8
$INDENT -npro -st $A9 boxed.c > output/boxed.c-9

$INDENT -npro outer.c -o output/outer.c-0
$INDENT -npro $A1 outer.c -o output/outer.c-1
$INDENT -npro $A2 outer.c -o output/outer.c-2
$INDENT -npro $A3 outer.c -o output/outer.c-3
$INDENT -npro $A4 outer.c -o output/outer.c-4
$INDENT -npro $A5 outer.c -o output/outer.c-5
$INDENT -npro $A6 outer.c -o output/outer.c-6
$INDENT -npro $A7 outer.c -o output/outer.c-7
$INDENT -npro $A8 outer.c -o output/outer.c-8
$INDENT -npro $A9 outer.c -o output/outer.c-9

A1="-fc1 -fca"
A2="-fc1 -fca -cdb"
A3="-fc1 -fca -cdb -sc"
A4="-fc1 -fca -sc"
A5="-fc1 -fca -l 50 -lc 50"
A6="-fc1 -fca -l 50 -lc 50 -cdb"
A7="-fc1 -fca -l 50 -lc 50 -sc"
A8="-fc1 -fca -l 50 -lc 50 -sc -cdb"

$INDENT -npro newlines.c -o output/newlines.c-0
$INDENT -npro $A1 newlines.c -o output/newlines.c-1
$INDENT -npro $A2 newlines.c -o output/newlines.c-2
$INDENT -npro $A3 newlines.c -o output/newlines.c-3
$INDENT -npro $A4 newlines.c -o output/newlines.c-4
$INDENT -npro $A5 newlines.c -o output/newlines.c-5
$INDENT -npro $A6 newlines.c -o output/newlines.c-6
$INDENT -npro $A7 newlines.c -o output/newlines.c-7
$INDENT -npro $A8 newlines.c -o output/newlines.c-8

A1="-l 50 -lc 50"
A2="-l 50 -lc 50 -c 20"
A3="-l 50 -lc 50 -cd 30"
A4="-c 20 -cd 30"
A5="-fc1 -fca"
A6="-l 50 -lc 50 -fc1 -fca"
A7="-cp 10"
A8="-fc1 -fca -l50 -lc50 -c 30 -cd 20 -cp 8"
A9="-cdb -sc -l 50 -lc 50 -fca -fc1"

$INDENT -npro cplus.c -o output/cplus.c-0
$INDENT -npro $A1 cplus.c -o output/cplus.c-1
$INDENT -npro $A2 cplus.c -o output/cplus.c-2
$INDENT -npro $A3 cplus.c -o output/cplus.c-3
$INDENT -npro $A4 cplus.c -o output/cplus.c-4
$INDENT -npro $A5 cplus.c -o output/cplus.c-5
$INDENT -npro $A6 cplus.c -o output/cplus.c-6
$INDENT -npro $A7 cplus.c -o output/cplus.c-7
$INDENT -npro $A8 cplus.c -o output/cplus.c-8
$INDENT -npro $A9 cplus.c -o output/cplus.c-9

A1="-sc -cdb -fc1"
A2="-i 10 -fc1"

$INDENT -npro tabs.c -o -fc1 output/tabs.c-0
$INDENT -npro $A1 tabs.c -o output/tabs.c-1
$INDENT -npro $A2 tabs.c -o output/tabs.c-2

$INDENT -npro cplus-one.c -o output/cplus-one.c
$INDENT -npro class-func.cc -o output/class-func.cc
$INDENT -npro empty.c -o output/empty.c
$INDENT -npro already-starred.c -o output/already-starred.c
$INDENT -npro box-comm.c -o output/box-comm.c
$INDENT -npro long-comm.c -o output/long-comm.c
$INDENT -npro ind-star.c -o output/ind-star.c
$INDENT -npro first-in-block.c -o output/first-in-block.c
$INDENT -npro two-on-line.c -o output/two-on-line.c
$INDENT -npro method.c -o output/method.c

A1="-fca"
$INDENT -npro right-margin-comment.c $A1 -o output/right-margin-comment.c

# These aren't really comment testing, they test the indent control
# statements '*INDENT-ON*' and '*INDENT-OFF*'
$INDENT -npro on-off-1.c -o output/on-off-1.c
$INDENT -npro on-off-2.c -o output/on-off-2.c


cd output
ERR=errors
for i in boxed.c-* outer.c-* newlines.c-* cplus.c-* tabs.c-* cplus-one.c class-func.cc \
        empty.c already-starred.c box-comm.c long-comm.c ind-star.c first-in-block.c \
        on-off-1.c on-off-2.c two-on-line.c method.c right-margin-comment.c
do
  echo -n ...$i...
  diff --initial-tab ../standard/$i $i > $i-diffs 2>&1
  if [ -s $i-diffs ]
  then
    echo -n ERROR: $i failed | tee -a $ERR
    echo >> $ERR
  else
    rm $i-diffs
  fi
  echo
done

echo Testing new comment stuff...Done.


# Now see if any errors occured.  If so, bitch and moan, otherwise,
# remove the output directory.
#
if test -s $ERR
then
  echo '****  Errors occured:'
  cat  $ERR   
  echo '****  Errors occured: ./output not removed'
  echo
else
  cd ..
  rm -rf output
  echo
  echo Regression test successfully completed.
  echo
fi
