#!/bin/sh

# The runOK function does the following for a test file that is not expected
# to cause any errors in the dmisParser:

# 1. It prints the name of the test file.

# 2. It runs the test file through the dmisParser and redirects the output
# to the file "junk1". The junk1 file will contain first, message lines that
# report any errors or warnings and the numbers of errors and warnings,
# and second (if there were no errors) the lines of a pretty printed file
# produced from the parse tree built by the parser when it parsed. The
# pretty printed file should be identical to the test file except for
# formatting.

# 3. It checks that the message lines of the junk1 file are identical to an
# expected message. If the test is passed, it prints the DMIS file part
# of the junk1 file to the temp1 file and goes on to the next step.
# Otherwise it prints "message test failed" and returns 1.

# 4. It prints a copy of the test file that is reformatted to have the same
# format as that used by the parser's pretty printer. 

# 5. It checks that the reformatted file (temp2) is identical to
# temp1. If the test passes (they are identical), it returns 0. If the
# test fails (they are not identical) it prints "cycle test failed" and
# returns 1. In this case, the difference between temp1 and temp2 will be
# found in the file junk2.

# Some of the test files have intentional errors or produce warnings. The
# runOut function is defined to handle these. It is almost identical to
# the first three steps of runOK. Only the message check is performed.

INA=../../../parserTestFiles/annexAIn
INE=../../../parserTestFiles/errorIn
INO=../../../parserTestFiles/okIn
OK=../../../parserTestFiles/okOut/OK.out
OUTA=../../../parserTestFiles/annexAOut
OUTE=../../../parserTestFiles/errorOut
OUTO=../../../parserTestFiles/okOut

function runOK
{
   echo $1
   ../bin/dmisParser $1 > junk1
   ../bin/removeLines $OK junk1 temp1
   if  [ "$?" -ne "0" ]; then
     echo "message test failed"
     return 1
   fi
   ../bin/reformatDmis $1 > temp2
   diff temp1 temp2 > junk2
   if [ "$?" -ne "0" ]; then
     echo "cycle test failed"
     return 1
   fi
   return 0
}

function runOut
{
   echo $1
   ../bin/dmisParser $1 > junk1
   ../bin/removeLines $2 junk1 temp1
   if [ "$?" -ne "0" ]; then
     echo "message test failed"
     return 1
   fi
   return 0
}

# syntactically correct programs from DMIS 5.2
runOK $INA/A.01.dmi              || exit
runOK $INA/A.02.dmi              || exit
runOK $INA/A.03.dmi              || exit
runOK $INA/A.04.2.dmi            || exit
runOK $INA/A.05.dmi              || exit
runOK $INA/A.06.dmi              || exit
runOK $INA/A.07.dmi              || exit
runOK $INA/A.08.1.dmi            || exit
runOK $INA/A.08.2.dmi            || exit
runOK $INA/A.08.3.dmi            || exit
runOK $INA/A.09.dmi              || exit
runOK $INA/A.10.dmi              || exit
runOK $INA/A.11.dmi              || exit
runOK $INA/A.12.dmi              || exit
runOK $INA/A.13.dmi              || exit
runOK $INA/A.14.dmi              || exit
runOK $INA/A.15.dmi              || exit
runOK $INA/A.16.dmi              || exit
runOK $INA/A.17.dmi              || exit
runOK $INA/A.18.dmi              || exit
runOK $INA/A.19.1.dmi            || exit
runOK $INA/A.19.2.dmi            || exit
runOK $INA/A.20.dmi              || exit
runOK $INA/A.21.dmi              || exit
runOK $INA/A.22.1.dmi            || exit
runOK $INA/A.22.2.dmi            || exit
runOK $INA/A.23.dmi              || exit
runOK $INA/A.24.dmi              || exit
runOK $INA/A.25.1.dmi            || exit
runOK $INA/A.25.2.dmi            || exit
runOK $INA/A.25.3.dmi            || exit
runOK $INA/A.26.dmi              || exit
runOK $INA/A.27.dmi              || exit
runOut $INA/A.28.dmi              $OUTA/A.28.out   || exit
runOK $INA/A.29.dmi              || exit
runOK $INA/A.30.1.dmi            || exit
runOK $INA/A.30.2.dmi            || exit
runOK $INA/A.30.3.dmi            || exit
runOK $INA/A.30.4.dmi            || exit
runOK $INA/A.30.5.dmi            || exit
runOK $INA/A.30.6.dmi            || exit
runOK $INA/A.30.7.dmi            || exit
runOK $INA/A.31.dmi              || exit
runOK $INA/A.32.dmi              || exit
runOK $INA/A.33.dmi              || exit
runOK $INA/A.34.1.dmi            || exit
runOK $INA/A.34.2.dmi            || exit
runOK $INA/A.34.3.dmi            || exit
runOK $INA/A.35.dmi              || exit
runOK $INA/A.36.dmi              || exit
runOK $INA/A.37.dmi              || exit
runOK $INA/A.38.dmi              || exit
runOK $INA/resume.dmi            || exit

# syntactically correct programs testing specific DMIS commands
runOK $INO/aclrat1.dmi           || exit
runOK $INO/algdef1.dmi           || exit
runOK $INO/assign1.dmi           || exit
runOK $INO/badtst1.dmi           || exit
runOK $INO/bound1.dmi            || exit
runOK $INO/calib1.dmi            || exit
runOK $INO/call1.dmi             || exit
runOK $INO/case1.dmi             || exit
runOK $INO/clmpid1.dmi           || exit
runOK $INO/clmpid2.dmi           || exit
runOK $INO/clmpsn1.dmi           || exit
runOK $INO/close1.dmi            || exit
runOK $INO/cmpntgrp1.dmi         || exit
runOK $INO/cnfrmrul1.dmi         || exit
runOK $INO/const1.dmi            || exit
runOK $INO/const2.dmi            || exit
runOK $INO/const3.dmi            || exit
runOK $INO/const4.dmi            || exit
runOK $INO/const5.dmi            || exit
runOK $INO/const6.dmi            || exit
runOK $INO/const7.dmi            || exit
runOK $INO/const8.dmi            || exit
runOK $INO/const9.dmi            || exit
runOK $INO/const10.dmi           || exit
runOK $INO/const11.dmi           || exit
runOK $INO/const12.dmi           || exit
runOK $INO/const13.dmi           || exit
runOK $INO/const14.dmi           || exit
runOK $INO/const15.dmi           || exit
runOK $INO/crgdef1.dmi           || exit
runOK $INO/crmode1.dmi           || exit
runOK $INO/croscl1.dmi           || exit
runOK $INO/crslct1.dmi           || exit
runOK $INO/cutcom1.dmi           || exit
runOK $INO/czone1.dmi            || exit
runOK $INO/czslct1.dmi           || exit
runOK $INO/datdef1.dmi           || exit
runOK $INO/datset1.dmi           || exit
runOK $INO/dattrgdef1.dmi        || exit
runOK $INO/decl1.dmi             || exit
runOK $INO/decpl1.dmi            || exit
runOK $INO/delete1.dmi           || exit
runOK $INO/device1.dmi           || exit
runOK $INO/dftcas1.dmi           || exit
runOK $INO/disply1.dmi           || exit
runOK $INO/dmehw1.dmi            || exit
runOK $INO/dmeid1.dmi            || exit
runOK $INO/dmesw1.dmi            || exit
runOK $INO/dmeswi1.dmi           || exit
runOK $INO/dmeswv1.dmi           || exit
runOK $INO/dmis1.dmi             || exit
runOK $INO/dmismd1.dmi           || exit
runOK $INO/dmismn1.dmi           || exit
runOK $INO/do1.dmi               || exit
runOK $INO/else1.dmi             || exit
runOK $INO/endcas1.dmi           || exit
runOK $INO/enddo1.dmi            || exit
runOK $INO/endfil1.dmi           || exit
runOK $INO/endgo1.dmi            || exit
runOK $INO/endif1.dmi            || exit
runOK $INO/endmac1.dmi           || exit
runOK $INO/endmes1.dmi           || exit
runOK $INO/endsel1.dmi           || exit
runOK $INO/endsimreqt1.dmi       || exit
runOK $INO/endxtn1.dmi           || exit
runOK $INO/equate1.dmi           || exit
runOK $INO/error1.dmi            || exit
runOK $INO/eval1.dmi             || exit
runOK $INO/extens1.dmi           || exit
runOK $INO/extfil1.dmi           || exit
runOK $INO/featArc1.dmi          || exit
runOK $INO/featArc2.dmi          || exit
runOK $INO/featCircle1.dmi       || exit
runOK $INO/featCompound1.dmi     || exit
runOK $INO/featCone1.dmi         || exit
runOK $INO/featConradsegmnt1.dmi || exit
runOK $INO/featCparln1.dmi       || exit
runOK $INO/featCylndr1.dmi       || exit
runOK $INO/featCylradsegmnt1.dmi || exit
runOK $INO/featEdgept1.dmi       || exit
runOK $INO/featEllips1.dmi       || exit
runOK $INO/featElongcyl1.dmi     || exit
runOK $INO/featGcurve1.dmi       || exit
runOK $INO/featGeom1.dmi         || exit
runOK $INO/featGsurf1.dmi        || exit
runOK $INO/featLine1.dmi         || exit
runOK $INO/featObject1.dmi       || exit
runOK $INO/featParpln1.dmi       || exit
runOK $INO/featPatern1.dmi       || exit
runOK $INO/featPlane1.dmi        || exit
runOK $INO/featPoint1.dmi        || exit
runOK $INO/featRctngl1.dmi       || exit
runOK $INO/featRevsurf1.dmi      || exit
runOK $INO/featSphere1.dmi       || exit
runOK $INO/featSphradsegmnt1.dmi || exit
runOK $INO/featSympln1.dmi       || exit
runOK $INO/featTorradsegmnt1.dmi || exit
runOK $INO/featTorus1.dmi        || exit
runOK $INO/fedrat1.dmi           || exit
runOK $INO/fildef1.dmi           || exit
runOK $INO/filnam1.dmi           || exit
runOK $INO/finpos1.dmi           || exit
runOK $INO/fixtid1.dmi           || exit
runOK $INO/fixtsn1.dmi           || exit
runOK $INO/fly1.dmi              || exit
runOK $INO/from1.dmi             || exit
runOK $INO/geoalg1.dmi           || exit
runOK $INO/geoalg2.dmi           || exit
runOK $INO/geom1.dmi             || exit
runOK $INO/gohome1.dmi           || exit
runOK $INO/gotarg1.dmi           || exit
runOK $INO/goto1.dmi             || exit
runOK $INO/group1.dmi            || exit
runOK $INO/if1.dmi               || exit
runOK $INO/includ1.dmi           || exit
runOK $INO/iterat1.dmi           || exit
runOK $INO/jumpto1.dmi           || exit
runOK $INO/keychar1.dmi          || exit
runOK $INO/litdef1.dmi           || exit
runOK $INO/litdef2.dmi           || exit
runOK $INO/locate1.dmi           || exit
runOK $INO/lotid1.dmi            || exit
runOK $INO/macro1.dmi            || exit
runOK $INO/macro2.dmi            || exit
runOK $INO/macro3.dmi            || exit
runOK $INO/macro4.dmi            || exit
runOK $INO/macro5.dmi            || exit
runOK $INO/matdef1.dmi           || exit
runOK $INO/meas1.dmi             || exit
runOK $INO/meas2.dmi             || exit
runOK $INO/mfgdev1.dmi           || exit
runOK $INO/mode1.dmi             || exit
runOK $INO/obtain1.dmi           || exit
runOK $INO/obtainCT.dmi          || exit
runOK $INO/obtainIP.dmi          || exit
runOK $INO/obtainMC.dmi          || exit
runOK $INO/obtainQI.dmi          || exit
runOK $INO/obtainRY.dmi          || exit
runOK $INO/open1.dmi             || exit
runOK $INO/operid1.dmi           || exit
runOK $INO/output1.dmi           || exit
runOK $INO/pameas1.dmi           || exit
runOK $INO/partid1.dmi           || exit
runOK $INO/partrv1.dmi           || exit
runOK $INO/partsn1.dmi           || exit
runOK $INO/path1.dmi             || exit
runOK $INO/planid1.dmi           || exit
runOK $INO/pop1.dmi              || exit
runOK $INO/prcomp1.dmi           || exit
runOK $INO/prevop1.dmi           || exit
runOK $INO/procid1.dmi           || exit
runOK $INO/prompt1.dmi           || exit
runOK $INO/psthru1.dmi           || exit
runOK $INO/ptbuff1.dmi           || exit
runOK $INO/ptmeas1.dmi           || exit
runOK $INO/push1.dmi             || exit
runOK $INO/qisdef1.dmi           || exit
runOK $INO/rapid1.dmi            || exit
runOK $INO/read1.dmi             || exit
runOK $INO/recall1.dmi           || exit
runOK $INO/refmnt1.dmi           || exit
runOK $INO/report1.dmi           || exit
runOK $INO/resume1.dmi           || exit
runOK $INO/rmeas1.dmi            || exit
runOK $INO/rmeas2.dmi            || exit
runOK $INO/rmeas3.dmi            || exit
runOK $INO/rmeas4.dmi            || exit
runOK $INO/rmeas5.dmi            || exit
runOK $INO/rmeas6.dmi            || exit
runOK $INO/rmeas7.dmi            || exit
runOK $INO/rotab1.dmi            || exit
runOK $INO/rotate1.dmi           || exit
runOK $INO/rotdef1.dmi           || exit
runOK $INO/rotset1.dmi           || exit
runOK $INO/save1.dmi             || exit
runOK $INO/scnmod1.dmi           || exit
runOK $INO/scnset1.dmi           || exit
runOK $INO/scnset2.dmi           || exit
runOK $INO/select1.dmi           || exit
runOK $INO/sensor1.dmi           || exit
runOK $INO/simreqt1.dmi          || exit
runOK $INO/snsdef1.dmi           || exit
runOK $INO/snsdef2.dmi           || exit
runOK $INO/snsdef3.dmi           || exit
runOK $INO/snsdef4.dmi           || exit
runOK $INO/snsdef5.dmi           || exit
runOK $INO/snsdef6.dmi           || exit
runOK $INO/snset1.dmi            || exit
runOK $INO/snsgrp1.dmi           || exit
runOK $INO/snslct1.dmi           || exit
runOK $INO/snsmnt1.dmi           || exit
runOK $INO/tecomp1.dmi           || exit
runOK $INO/text1.dmi             || exit
runOK $INO/thldef1.dmi           || exit
runOK $INO/tolAngl1.dmi          || exit
runOK $INO/tolAnglB1.dmi         || exit
runOK $INO/tolAnglR1.dmi         || exit
runOK $INO/tolAnglWrt1.dmi       || exit
runOK $INO/tolCirlty1.dmi        || exit
runOK $INO/tolCompos1.dmi        || exit
runOK $INO/tolConcen1.dmi        || exit
runOK $INO/tolCortol1.dmi        || exit
runOK $INO/tolCprofl1.dmi        || exit
runOK $INO/tolCprofs1.dmi        || exit
runOK $INO/tolCrnout1.dmi        || exit
runOK $INO/tolCylcty1.dmi        || exit
runOK $INO/tolDiam1.dmi          || exit
runOK $INO/tolDistB1.dmi         || exit
runOK $INO/tolDistWrt1.dmi       || exit
runOK $INO/tolFlat1.dmi          || exit
runOK $INO/tolGtol1.dmi          || exit
runOK $INO/tolParlel1.dmi        || exit
runOK $INO/tolPerp1.dmi          || exit
runOK $INO/tolPos1.dmi           || exit
runOK $INO/tolProfl1.dmi         || exit
runOK $INO/tolProfp1.dmi         || exit
runOK $INO/tolProfs1.dmi         || exit
runOK $INO/tolRad1.dmi           || exit
runOK $INO/tolStrght1.dmi        || exit
runOK $INO/tolSym1.dmi           || exit
runOK $INO/tolTrnout1.dmi        || exit
runOK $INO/tolUsetol1.dmi        || exit
runOK $INO/tolWidth1.dmi         || exit
runOK $INO/tooldf1.dmi           || exit
runOK $INO/trans1.dmi            || exit
runOK $INO/uncertalg1.dmi        || exit
runOK $INO/uncertset1.dmi        || exit
runOK $INO/units1.dmi            || exit
runOK $INO/value1.dmi            || exit
runOK $INO/value2.dmi            || exit
runOK $INO/value3.dmi            || exit
runOK $INO/value4.dmi            || exit
runOK $INO/value5.dmi            || exit
runOK $INO/vform1.dmi            || exit
runOK $INO/windef1.dmi           || exit
runOK $INO/windef2.dmi           || exit
runOK $INO/wkplan1.dmi           || exit
runOK $INO/wrist1.dmi            || exit
runOK $INO/write1.dmi            || exit
runOK $INO/xtern1.dmi            || exit
runOK $INO/xtract1.dmi           || exit

# syntactically correct programs testing special features
runOut $INO/confusing.dmi         $OUTO/confusing.out || exit
runOK $INO/exprsArith.dmi        || exit
runOK $INO/exprsLogic.dmi        || exit
runOK $INO/exprsVector.dmi       || exit
runOK $INO/funcsBool.dmi         || exit
runOK $INO/funcsChar.dmi         || exit
runOK $INO/funcsInt.dmi          || exit
runOK $INO/funcsReal.dmi         || exit
runOK $INO/funcsVec.dmi          || exit
runOK $INO/preTest1.dmi          || exit
runOK $INO/preTest2.dmi          || exit
runOK $INO/preTest3.dmi          || exit
runOK $INO/preTest4.dmi          || exit

# programs with syntactic errors
runOut $INE/callError1.dmi            $OUTE/callError1.out            || exit
runOut $INE/callError2.dmi            $OUTE/callError2.out            || exit
runOut $INE/featgcurveError.dmi       $OUTE/featgcurveError.out       || exit
runOut $INE/featgsurfError.dmi        $OUTE/featgsurfError.out        || exit
runOut $INE/featrevsurfError.dmi      $OUTE/featrevsurfError.out      || exit
runOut $INE/fileEndInDmisOffError.dmi $OUTE/fileEndInDmisOffError.out || exit
runOut $INE/fileEndInIfError.dmi      $OUTE/fileEndInIfError.out      || exit
runOut $INE/fileEndInMeasError.dmi    $OUTE/fileEndInMeasError.out    || exit
runOut $INE/funcsRealError.dmi        $OUTE/funcsRealError.out        || exit
runOut $INE/groupError.dmi            $OUTE/groupError.out            || exit
runOut $INE/macroArgRefError.dmi      $OUTE/macroArgRefError.out      || exit
runOut $INE/macroArgTwiceError.dmi    $OUTE/macroArgTwiceError.out    || exit
runOut $INE/macroEndmacError.dmi      $OUTE/macroEndmacError.out      || exit
runOut $INE/pathError.dmi             $OUTE/pathError.out             || exit
runOut $INE/preTestContinueError.dmi  $OUTE/preTestContinueError.out  || exit
runOut $INE/preTestCrMissingError.dmi $OUTE/preTestCrMissingError.out || exit
runOut $INE/preTestLfMissingError.dmi $OUTE/preTestLfMissingError.out || exit
runOut $INE/preTestNewlineError.dmi   $OUTE/preTestNewlineError.out   || exit
runOut $INE/preTestUnixEndError.dmi   $OUTE/preTestUnixEndError.out   || exit
runOut $INE/promptError.dmi           $OUTE/promptError.out           || exit

rm junk1 junk2 temp1 temp2
