#!/bin/sh
#------------------------------------------------------------------------------
# =========                 |
# \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
#  \\    /   O peration     |
#   \\  /    A nd           | www.openfoam.com
#    \\/     M anipulation  |
#------------------------------------------------------------------------------
#     Copyright (C) 2020 OpenCFD Ltd.
#------------------------------------------------------------------------------
# License
#     This file is part of OpenFOAM, distributed under GPL-3.0-or-later.
#
# Script
#     tutorials/AutoTest dir [.. dirN]
#
# Description
#     Run foamRunTutorials with specified tutorial directories
#     Creates/destroys a temporary directory for each test.
#
# Environment
#     Requires an initialized OpenFOAM environment.
#
# Note
#     Potentially useful for debian autopkgtest
#
#------------------------------------------------------------------------------
# Auto-detect from location
#Unused# projectDir="$(\cd "$(dirname "${0%/*}")" && \pwd -L)"

#------------------------------------------------------------------------------
printHelp() {
    cat<<USAGE

usage: ${0##*/} [OPTION] dir [.. dirN]

options:
  -1            Modify case controlDict to run only one time step (default)
  -full         Do not modify controlDict (run tutorial to completion)
  -debian       Any modifications when running with autopkgtest
  -help         Print the usage

Run foamRunTutorials with specified tutorial directories.
Creates/destroys a temporary directory for each.

USAGE
    exit 0 # A clean exit
}

# Report error and exit
die()
{
    exec 1>&2
    echo
    echo "Error encountered:"
    while [ "$#" -ge 1 ]; do echo "    $1"; shift; done
    echo
    echo "See '${0##*/} -help' for usage"
    echo
    exit 1
}

#------------------------------------------------------------------------------

unset optDebian optVerbose
optRunLimit=1

# Parse options
while [ "$#" -gt 0 ]
do
    case "$1" in
    -h*)
        printHelp
        ;;

    -1)
        optRunLimit="${1#-}"
        ;;

    -full)
        unset optRunLimit
        ;;

    -debian)
        # Redirect stderr to stdout, if autopkgtest (tests/control)
        # does NOT use "Restrictions: allow-stderr"
        exec 2>&1
        ;;

    --)
        break
        ;;

    -*)
        die "unknown option $1"
        ;;

    *)
        break
        ;;
    esac
    shift
done


#------------------------------------------------------------------------------
# Basic sanity checks

[ -n "$FOAM_TUTORIALS" ] || export FOAM_TUTORIALS="$WM_PROJECT_DIR"/tutorials

[ -d "${WM_PROJECT_DIR:?}" ] || die "No OpenFOAM environment: $WM_PROJECT_DIR"
[ -d "$FOAM_TUTORIALS" ] || die "No OpenFOAM tutorials : $FOAM_TUTORIALS"


#------------------------------------------------------------------------------

#
# Modify case controlDicts to run only one time step
#
modifyCaseControlDict()
{
    for dict in $(find . -name "controlDict*" -type f)
    do
        cp -f "${dict}" "${dict}.orig"
        sed \
            -e 's/\(startFrom[ \t]*\)\([A-Za-z]*\);/\1 latestTime;/' \
            -e 's/\(stopAt[ \t]*\)\([A-Za-z]*\);/\1 nextWrite;/' \
            -e 's/\(writeControl[ \t]*\)\([A-Za-z]*\);/\1 timeStep;/' \
            -e 's/\(writeInterval[ \t]*\)\([-.0-9A-Za-z]*\);/\1 '"$optRunLimit"';/' \
            "${dict}.orig" > "${dict}"
    done
}


#------------------------------------------------------------------------------

nTests="$#"
nPassed=0

for testdir in "$@"
do
    testdir="${testdir#tutorials/}"
    testdir="$(echo "$testdir" | sed -e 's@^//*@@; s@//*$@@;')"
    suffix="$(echo "$testdir" | sed -e 's@//*@_@g')"

    if [ -n "$testdir" ] && [ -d "$FOAM_TUTORIALS/$testdir" ]
    then
    (
        echo "Run test: $testdir"
        set -e

        TESTDIR="$(mktemp --directory --suffix=".$suffix")"
        trap 'rm -rf $TESTDIR' 0 INT QUIT ABRT PIPE TERM

        cp -r "$FOAM_TUTORIALS/$testdir"/* "$TESTDIR"/
        cd "$TESTDIR"

        if [ -n "$optRunLimit" ]
        then
            set +e
            modifyCaseControlDict
            set -e
        fi

        nInput="$(ls | wc -l)"
        foamRunTutorials
        nOutput="$(ls | wc -l)"

        if [ "$nInput" = 0 ]
        then
            echo "No input for $testdir" 1>&2
            exit 1
        elif [ "$nOutput" = "$nInput" ]
        then
            echo "Run failure for $testdir" 1>&2
            exit 1
        else
            echo "run: OK"
        fi
    ) && nPassed=$((nPassed + 1))

    else
        echo "No tutorial: $testdir" 1>&2
    fi
done


if [ "$nTests" = 0 ]
then
    die "No tests specified"
elif [ "$nPassed" = "$nTests" ]
then
    echo "Passed all $nTests tests"
else
    echo "Passed $nPassed/$nTests tests" 1>&2
    exit 1
fi

#------------------------------------------------------------------------------
