#!/bin/bash # This file is part of mutest, a micro testing framework for C. # # mutest is under the BOLA license, please see the LICENSE file or visit # http://blitiri.com.ar/p/bola/ # # This is a simple script to generate a C file that runs all the test cases # present in .o files passed as arguments. # # Please, read the README file for more details. # the trick here is getting all the test cases present in an object file using # nm. All the tests must take and return void, start with "mutest_" and, of # course, should not be static, which leads to a small limitation: all test # cases must have unique names, even across test suites. # the first argument should be mutest.h if [ -z "$1" ] then echo "Too few arguments" >&2 echo "Usage: $0 mutest_h_location [object files...]" >&2 exit 1 fi mutest_h="$1" shift echo "#include \"$mutest_h\"" echo "void mu_run_suites() {" echo for file in "$@" do pr_file=`echo "$file" | sed 's/\"/\\\\\"/g'` suite=`basename "$file" .o | sed 's/\"/\\\\\"/g'` symbols=`nm -p "$file" | egrep '^[[:xdigit:]]{8} T mu_\w+$' | cut -c12-` tests=`echo "$symbols" | egrep '^mu_test'` inits=`echo "$symbols" | egrep '^mu_init'` terms=`echo "$symbols" | egrep '^mu_term'` echo -e '\tdo {' echo -e '\t\tmutest_suite_name = "'"$suite"'";' echo -e '\t\tmu_print(MU_SUITE, "\\nRunning suite '"'$suite'"'\\n");' for init in $inits do echo -e "\\t\\tmu_run_init($init);" done for testcase in $tests do echo -e "\t\tmu_run_case($testcase);" done for term in $terms do echo -e "\t\tmu_run_term($term);" done echo -e "\t\tif (mutest_suite_failed) ++mutest_failed_suites;" echo -e "\t\telse ++mutest_passed_suites;" echo -e "\t\tmutest_suite_failed = 0;" echo -e '\t} while (0);' echo done echo "}"