#!./common/bats/bin/bats
# -*-sh-*-

source ./common/test_helper_functions.bash || exit 1
source ./common/functions || exit 1

if [ -s ./common/TEST_ENV ]; then
    source ./common/TEST_ENV
fi

check_rms
rm=$RESOURCE_MANAGER

PKG=HYPRE
module=hypre
library=libHYPRE
header=HYPRE.h
rpm=hypre-$LMOD_FAMILY_COMPILER-$LMOD_FAMILY_MPI${DELIM}

setup() {
    OUTPUT="$(mktemp)"
}

teardown() {
    rm -f "${OUTPUT}"
}

@test "[libs/HYPRE] Verify $PKG module is loaded and matches rpm version ($LMOD_FAMILY_COMPILER/$LMOD_FAMILY_MPI)" {
    module list $module | grep "1) $module" >&"${OUTPUT}" || exit 1
    run grep $module "${OUTPUT}"
    assert_success

    # check version against rpm
    local version="$(rpm -q --queryformat='%{VERSION}\n' $rpm)"
    run cat "${OUTPUT}"
    assert_output "  1) $module/$version"
}

@test "[libs/HYPRE] Verify module ${PKG}_DIR is defined and exists ($LMOD_FAMILY_COMPILER/$LMOD_FAMILY_MPI)" {
    DIR=${PKG}_DIR

    if [ -z "${!DIR}" ]; then
        flunk "${PKG}_DIR directory not defined"
    fi

    if [ ! -d "${!DIR}" ]; then
        flunk "directory ${!DIR} does not exist"
    fi
}

# ----------
# Lib Tests
# ----------

@test "[libs/HYPRE] Verify module ${PKG}_LIB is defined and exists ($LMOD_FAMILY_COMPILER/$LMOD_FAMILY_MPI)" {
    LIB=${PKG}_LIB

    if [ -z "${!LIB}" ]; then
        flunk "${PKG}_LIB directory not defined"
    fi

    if [ ! -d "${!LIB}" ]; then
        flunk "directory ${!LIB} does not exist"
    fi
}

@test "[libs/HYPRE] Verify dynamic library available in ${PKG}_LIB ($LMOD_FAMILY_COMPILER/$LMOD_FAMILY_MPI)" {
    LIB=${PKG}_LIB

    if [ -z "${!LIB}" ]; then
        flunk "${PKG}_LIB directory not defined"
    fi

    if [ ! -s "${!LIB}/${library}.so" ]; then
        flunk "${library}.so does not exist"
    fi
}

@test "[libs/HYPRE] Verify static library is not present in ${PKG}_LIB ($LMOD_FAMILY_COMPILER/$LMOD_FAMILY_MPI)" {
    LIB=${PKG}_LIB

    if [ -z "${!LIB}" ]; then
        flunk "${PKG}_LIB directory not defined"
    fi

    if [ -e "${!LIB}/${library}.a" ]; then
        flunk "${library}.a exists when not expecting it"
    fi
}

# --------------
# Include Tests
# --------------

@test "[libs/HYPRE] Verify module ${PKG}_INC is defined and exists ($LMOD_FAMILY_COMPILER/$LMOD_FAMILY_MPI)" {
    INC=${PKG}_INC

    if [ -z "${!INC}" ]; then
        flunk "${PKG}_INC directory not defined"
    fi

    if [ ! -d "${!INC}" ]; then
        flunk "directory ${!INC} does not exist"
    fi
}

@test "[libs/HYPRE] Verify header file is present in ${PKG}_INC ($LMOD_FAMILY_COMPILER/$LMOD_FAMILY_MPI)" {
    INC=${PKG}_INC

    if [ -z "${!INC}" ]; then
        flunk "${PKG}_INC directory not defined"
    fi

    if [ ! -s "${!INC}/${header}" ]; then
        flunk "header $header file does not exist"
    fi
}

@test "[libs/HYPRE] Sample job ($rm/$LMOD_FAMILY_COMPILER/$LMOD_FAMILY_MPI)" {
    if [ ! -x "ex1" ]; then
        flunk "ex1 binary not available"
    fi

    run_mpi_binary ./ex1 "atest" 1 1
    assert_success
}
