#! /usr/bin/env python # encoding: utf-8 # Richard Quirk, 2008 """ Execute tests during the build - requires cppunit To force all tests, run with "waf build --alltests" """ from waflib.Tools import waf_unit_test top = '.' out = 'build' def options(opt): opt.load('compiler_cxx') opt.load('waf_unit_test') def configure(conf): conf.load('compiler_cxx') conf.load('waf_unit_test') # the demo files require cppunit - but the waf tool does not conf.check_cfg(package='cppunit', args='--cflags --libs', mandatory=True) if 'dl' not in conf.env.LIB_CPPUNIT: l = conf.check(lib='dl', uselib_store='CPPUNIT') # the interpreted tests need python conf.find_program('python', mandatory=False) from waflib import Logs def summary(bld): lst = getattr(bld, 'utest_results', []) if lst: total = len(lst) tfail = len([x for x in lst if x[1]]) val = 100 * (total - tfail) / (1.0 * total) Logs.pprint('CYAN', 'test report %3.0f%% success' % val) Logs.pprint('CYAN', ' tests that fail %d/%d' % (tfail, total)) for result in lst: if result.exit_code: # In ut_task we have the task running the test and we can get any extra information # from there (in this example just the generator name) Logs.pprint('CYAN', ' %s (%s)' % (result.test_path, result.generator.name)) Logs.pprint('RED', 'status: %r' % result.exit_code) if result.out: Logs.pprint('RED', 'out: %r' % result.out) if result.err: Logs.pprint('RED', 'err: %r' % result.err) 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(summary) # to execute all tests: # $ waf --alltests # to set this behaviour permanently: #bld.options.all_tests = True bld.options.clear_failed_tests = True # debugging zone: # $ waf --zones=ut # setting the cwd for a unit test execution: see tests/test1/wscript_build (ut_cwd)