#!/bin/bash

# This program will generate test documentation from the robot test cases.

# Description of argument(s):
# test_dir_path            Test directory where robot test cases are available.
# test_case_doc_file_path  The test case document file path to be stored.


function get_parms() {

    # Get program parms.

    test_dir_path="${1}" ; shift
    test_case_doc_file_path="${1}" ; shift

    return 0

}


function validate_parms() {

    # Validate program parameters.

    num_parms="${1}" ; shift

    (( ${num_parms} == 0 )) && return 0

    if [ -z "${test_dir_path}" ] ; then
        echo "**ERROR** You must provide test directory as the first positional" \
            "parameter." >&2
        return 1
    fi

    if [ -z "${test_case_doc_file_path}" ] ; then
        echo "**ERROR** You must provide file path as the second positional" \
            "parameter." >&2
        return 1
    fi

    return 0

}


function generate_all_test_document() {

    # Generate all test case documents

    local ret_code=0
    python -m robot.testdoc tests testsdirectoryTCdocs.html || ret_code=1
    python -m robot.testdoc extended extendeddirectoryTCdocs.html || ret_code=1
    python -m robot.testdoc gui guidirectoryTCdocs.html || ret_code=1
    python -m robot.testdoc systest systestdirectoryTCdocs.html || ret_code=1
    python -m robot.testdoc xcat xcatdirectoryTCdocs.html || ret_code=1
    python -m robot.testdoc mnfg mnfgdirectoryTCdocs.html || ret_code=1
    python -m robot.testdoc tools toolsdirectoryTCdocs.html || ret_code=1
    python -m robot.testdoc ./openpower/ras rasdirectoryTCdocs.html || ret_code=1
    python -m robot.testdoc ./openpower/secureboot securebootdirectoryTCdocs.html\
        || ret_code=1
    python -m robot.testdoc network networkdirectoryTCdocs.html ||\
        ret_code=1

    return ${ret_code}
}


function main_function() {

    get_parms "$@" || return 1

    validate_parms $# || return 1

    if (( ${num_parms} == 0 )) ; then
        generate_all_test_document || return 1
        return 0
    fi

    echo ${test_dir_path} ${test_case_doc_file_path}
    python -m robot.testdoc ${test_dir_path} ${test_case_doc_file_path}\
        || return 1

    return 0

}


# Main

main_function "${@}"
rc="${?}"
exit "${rc}"

