#! /usr/bin/env python
# encoding: utf-8
# Sylvain Rouquette, 2014
# based on Richard Quirk's demo (unit_test), 2008

"""
Execute tests during the build - requires cppunit

To force all tests, run with "waf build --alltests"
"""

from waflib import Logs

top = '.'
out = 'build'

def options(opt):
    opt.load('compiler_cxx')
    opt.load('waf_unit_test')
    opt.add_option('--onlytests', action='store_true', default=True, help='Exec unit tests only', dest='only_tests')

def configure(conf):
    conf.load('compiler_cxx')
    conf.load('waf_unit_test')
    conf.check(lib='gtest', uselib_store='GTEST')


def gtest_results(bld):
    lst = getattr(bld, 'utest_results', [])
    if not lst:
        return
    for result in lst:
        # if not result.exit_code:
        #     continue

        # uncomment if you want to see what's happening
        # print(str(out, 'utf-8'))
        output = str(result.out, 'utf-8').splitlines()
        for i, line in enumerate(output):
            if '[ RUN      ]' in line and result.exit_code:
                i += 1
                if '    OK ]' in output[i]:
                    continue
                while not '[ ' in output[i]:
                    Logs.warn(output[i])
                    i += 1
            elif ' FAILED  ]' in line and result.exit_code:
                Logs.error(line)
            elif ' PASSED  ]' in line:
                Logs.info(line)

def build(bld):
    bld.recurse('src tests')

    # waf_unit_test.summary is a pretty ugly function for displaying a report (feel free to improve!)
    # results -> bld.utest_results [(filename, returncode, stdout, stderr), (..., ), ...]
    #bld.add_post_fun(waf_unit_test.summary)
    bld.add_post_fun(gtest_results)

    # to execute all tests:
    # $ waf --alltests
    # to set this behaviour permanently:
    bld.options.all_tests = True

    # debugging zone:
    # $ waf --zones=ut
    # setting the cwd for a unit test execution: see tests/test1/wscript_build (ut_cwd)

