#!/bin/sh

#
#        Example Script to run tests and check results.
#
#        This is an example script for running QA tests on a
#        model and then checking the simulated results against
#        reference results. A separate target is defined for each
#        variant of the model. The program runQaTests.pl runs the
#        tests, and that program expects a perl module SIMULATOR.pm
#        to be provided for each simulator that is tested.
#        Examples of these are provided.
#

qaSpecFile="qaSpec"
qaResultsDirectory="results"
testProgramName="$(dirname $0)/runQaTests.pl"
if [ -z "$testProgramFlags" ] ; then
    testProgramFlags="-nwV"
fi

#testProgramFlags="-d"


help() {
    cat <<-EOF
        Valid targets are:

        all                run tests and compare results for all simulators

        ngspice            run tests and compare results ngspice

        clean              remove all previously generated simulation results

        NOTE: if test results exist they are not resimulated
        NOTE: to force resimulation run "make clean" first
EOF
}


run_test() {

    simname="$1"

    localPlatform=`${testProgramName} -platform`
    localVersion=`${testProgramName} -sv -s ${simname} ${qaSpecFile}`

    echo ""
    echo "******"
    echo "****** ${qaSpecFile} tests for ${simname}"
    echo "****** (for version ${localVersion} on platform ${localPlatform})"
    echo "******"

    for test in `${testProgramName} -lt -s ${simname} ${qaSpecFile}` ; do

        echo ""
        echo "****** Checking test (${simname}): ${test}"

        for variant in `${testProgramName} -lv -s ${simname} ${qaSpecFile}` ; do
            ${testProgramName} \
                ${testProgramFlags} \
                -s ${simname} \
                -r -t ${test} \
                -var ${variant} \
                --results=${qaResultsDirectory} \
                ${qaSpecFile}
        done
    done

    for version in `ls -C1 ${qaResultsDirectory}/${simname}` ; do
        for platform in `ls -C1 ${qaResultsDirectory}/${simname}/${version}` ; do

            if [ ${version} = ${localVersion}  -a  ${platform} = ${localPlatform} ]
            then
                break
            fi

            echo ""
            echo "******"
            echo "****** Comparing previously run ${qaSpecFile} tests for ${simname}"
            echo "****** (for version ${version} on platform ${platform})"
            echo "******"

            for test in `${testProgramName} -lt -s ${simname} ${qaSpecFile}` ; do

                echo ""
                echo "****** Checking test (${simname}): ${test}"

                for variant in `${testProgramName} -lv -s ${simname} ${qaSpecFile}` ; do
                    ${testProgramName} \
                        -c ${version} ${platform} \
                        -s ${simname} \
                        -t ${test} \
                        -var ${variant} \
                        --results=${qaResultsDirectory} \
                        ${qaSpecFile}
                done
            done
        done
    done
}


#####
##### ngspice tests
#####

ngspice() {
    run_test ngspice
}



clean() {
    rm -rf ${qaResultsDirectory}/ngspice ngspiceCkt*
}


all() {
    ngspice
}


while test $# -gt 0; do
  case "$1" in
      --srcdir=* | --executable=*)
          testProgramFlags="$testProgramFlags $1"
          shift
          ;;
      --results)
          qaResultsDirectory="$2"
          shift ; shift
          ;;
      -qa)
          qaSpecFile="$2"
          shift ; shift
          ;;
      *)
          break
          ;;
  esac
done

for arg in $@ ; do
    case "$arg" in
        all | clean | ngspice)
            "$arg"
            ;;
        *)
            help
            ;;
    esac
done
