#!/usr/bin/env python3
# -*- coding: utf-8 -*-

"""
Runs all the possible tests using bats.

Usage:
  qp_test [-av] [TEST]

Options:
  -v    verbose output
  -a    test all installed modules. Default is to test the current directory.

"""

import sys
import os
import subprocess

try:
    from docopt import docopt
    from qp_path import QP_SRC, QP_TESTS
except ImportError:
    print("Please check if you have sourced the ${QP_ROOT}/quantum_package.rc")
    print("(`source ${QP_ROOT}/quantum_package.rc`)")
    sys.exit(1)


def main(arguments):
    """Main function"""

    # Fetch all *.bats files
    l_bats = []
    def append_bats(dirname, filenames):
        for f in filenames:
            if f.endswith(".bats"):
                number, _ = f.split('.', 1)
                l_bats.append((int(number), os.path.join(dirname, f)))

    if arguments["TEST"]:
        os.environ["TEST"] = arguments["TEST"]

    if arguments["-a"]:
        for (dirname, _, filenames) in os.walk(QP_SRC, followlinks=False):
            if "IRPF90_temp" not in dirname:
                append_bats(dirname, filenames)
    else:
        for (dirname, _, filenames) in os.walk(os.getcwd(), followlinks=False):
            if "IRPF90_temp" not in dirname and "external" not in dirname:
                append_bats(dirname, filenames)
    l_bats = [y for _, y in sorted(l_bats)]

    # Execute tests
    os.chdir(QP_TESTS)

    for bats_file in l_bats:
        print("")
        print("-~-~-~-~-~-~")
        print("")
        print("Running tests for %s"%(bats_file))
        print("")
        if arguments["-v"]:
            if arguments["TEST"]:
                test = "export TEST=%s ; "%arguments["TEST"]
            else:
                test = ""
            os.system(test+" python3 bats_to_sh.py "+bats_file+
                                    "| bash")
        else:
#           print(" ".join(["bats", "--verbose-run", "--trace", bats_file]))
            subprocess.check_call(["bats", "--verbose-run", "--trace", bats_file], env=os.environ)



if __name__ == '__main__':
    ARGS = docopt(__doc__)
    main(ARGS)