7 def die(msg_s
, fname
=None, line
=None):
8 msg('E', msg_s
, fname
, line
)
11 def warn(msg_s
, fname
=None, line
=None):
12 msg('W', msg_s
, fname
, line
)
14 def msg(prefix
, msg_s
, fname
=None, line
=None):
21 sys
.stderr
.write(s
+ msg_s
+ '\n')
25 suites
= {} # {"suitename":["testname":{test_parameters}]}
27 suite_re
= re
.compile("\A\\s*GP_SUITE\\((.*)\\)\\s*\Z")
28 test_re
= re
.compile("\A\\s*GP_TEST\\((.*)\\)\\s*\Z")
31 def find_GP_directive(name
, regexp
, l
, fname
='unknown', line
=0):
32 "Looks for a given GP_* directive, parses args if any, "
33 "retuns (name, dict_of_args) or (None, None) if not found."
37 warn("found unsuitable %s directive, ignoring." % name
, fname
, line
)
39 d
= m
.groups()[0].split(',', 1)
43 s
= 'dict( ' + d
[1].strip(" \t\n\"") + ' )'
46 die("error parsing arguments: %r" % s
, fname
, line
)
47 return d
[0].strip(), args
50 def find_tests(f
, fname
):
51 "Finds all tests in a file."
54 for i
in range(len(ls
)):
56 # Look for suite declaration
57 name
, args
= find_GP_directive("GP_SUITE", suite_re
, l
, fname
=fname
, line
=i
)
61 warn("suite should have no arguments other than name.", fname
, i
)
62 suites
.setdefault(name
, [])
63 # Look for suite declaration
64 name
, args
= find_GP_directive("GP_TEST", test_re
, l
, fname
=fname
, line
=i
)
68 test_suite
= args
['suite']
70 test_suite
= 'default'
71 warn("no suite defined before test %s, using %r." % (name
, test_suite
), fname
, i
)
75 suites
.setdefault(test_suite
, [])
76 suites
[test_suite
].append(args
)
80 " * This GENERATED file is part of GfxPrim. See LICENSE for legal stuff.\n"
81 " * Do not modify this file directly!\n"
83 "#include <check.h>\n\n")
85 for suite
, tests
in suites
.iteritems():
86 f
.write("/****************************************************************\n"
91 " * Test %s/%s defined in %s:%d\n"
92 " */\n\n" % (suite
, t
['name'], t
['fname'], t
['line']))
93 f
.write("void GP_TEST_%s(int);\n\n"
94 "TCase *GP_TC_%s_%s()\n"
96 " TCase *tc = tcase_create(\"%s\");\n" %
97 (t
['name'], suite
, t
['name'], t
['name']))
98 signal
= t
.get('expect_signal', 0)
99 exitval
= t
.get('expect_exit', 0)
100 assert ('loop_start' in t
) == ('loop_end' in t
)
101 loop_start
= t
.get('loop_start', 0)
102 loop_end
= t
.get('loop_end', 1)
103 f
.write(" _tcase_add_test(tc, GP_TEST_%s, \"%s\", %d, %d, %d, %d);\n" % \
104 (t
['name'], t
['name'], signal
, exitval
, loop_start
, loop_end
))
105 f
.write(" return tc;\n}\n\n")
106 # TODO: Handle special test requirements (timing, fixture, ...)
108 f
.write("Suite *GP_TS_%s()\n"
110 " Suite *s = suite_create(\"%s\");\n" % (suite
, suite
))
112 f
.write(" suite_add_tcase(s, GP_TC_%s_%s());\n" % (suite
, t
['name']))
113 f
.write(" return s;\n"
116 f
.write("/****************************************************************\n"
117 " * Create and add all suites to a SRunner\n"
119 "void GP_AddSuitesToSRunner(SRunner *sr)\n"
122 f
.write(" srunner_add_suite(sr, GP_TS_%s());\n" % suite
)
128 opts
, args
= getopt
.gnu_getopt(sys
.argv
[1:], "c:")
130 die("Invalid arguments")
132 for opt
, val
in opts
:
136 die("You must specify: -c <output.c>")
142 die("Unable to open '%s'" % fn
)
147 f
= open(cfile
, 'wt')
149 die("Unable to open '%s'" % cfile
)
153 if __name__
== '__main__':