#!/usr/bin/env python

from __future__ import print_function, unicode_literals

"""Take a clar executable and create a CTest file for each suite
"""

from os import path
import subprocess

def parse_suites(exe):
    """Ask the clar executable 'exe' for its suites

    Returns a list of suites
    """
    suites = subprocess.check_output([exe, '-l'])
    return map(lambda s: s.split(' ')[1], # get the name from each line of output
               filter(lambda s: s, # Remove any empty lines
                      map(lambda s: s.strip(), # remove leading whitespace
                          suites.split('\n')[3:]))) # skip first three which are info messages

if __name__ == '__main__':
    from argparse import ArgumentParser

    parser = ArgumentParser(description="clar to CTest job creator")
    parser.add_argument('clar', type=unicode, help="Clar runner")
    parser.add_argument('testfile', type=unicode, help="Test file to write")

    args = parser.parse_args()

    if not path.isfile(args.clar):
        print("fatal: clar runner not found", file=sys.stderr)
        exit(1)

    suites = parse_suites(args.clar)
    print("Found {} suites".format(len(suites)))

    with open(args.testfile, 'w') as f:
        print("# File generated by ctest-jobs.py", file=f)
        for suite in suites:
            name = "{}-{}".format(args.clar, suite)
            print("add_test({} \"{}\" \"-v\" \"-s{}\")".format(name, args.clar, suite), file=f)
