Naive blit implementation (testing reference)
[gfxprim.git] / tests / core / find_tests.py
blob7ddc7fbb7ad251b677b4d40f2738314675521a19
1 #!/bin/python
3 import sys, re, getopt
5 # Helpers
7 def die(msg_s, fname=None, line=None):
8 msg('E', msg_s, fname, line)
9 sys.exit(1)
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):
15 s = '[' + prefix
16 if fname:
17 s += ' ' + fname
18 if line:
19 s += ':%d'%line
20 s += '] '
21 sys.stderr.write(s + msg_s + '\n')
23 # Globals
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."
34 if name in l:
35 m = regexp.search(l)
36 if not m:
37 warn("found unsuitable %s directive, ignoring." % name, fname, line)
38 else:
39 d = m.groups()[0].split(',', 1)
40 args = {}
41 if len(d)>1:
42 try:
43 s = 'dict( ' + d[1].strip(" \t\n\"") + ' )'
44 args = eval(s)
45 except:
46 die("error parsing arguments: %r" % s, fname, line)
47 return d[0].strip(), args
48 return None, None
50 def find_tests(f, fname):
51 "Finds all tests in a file."
52 suite = None
53 ls = f.readlines()
54 for i in range(len(ls)):
55 l = ls[i]
56 # Look for suite declaration
57 name, args = find_GP_directive("GP_SUITE", suite_re, l, fname=fname, line=i)
58 if name:
59 suite = name
60 if args:
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)
65 if name:
66 test_suite = suite
67 if 'suite' in args:
68 test_suite = args['suite']
69 if not test_suite:
70 test_suite = 'default'
71 warn("no suite defined before test %s, using %r." % (name, test_suite), fname, i)
72 args['name'] = name
73 args['fname'] = fname
74 args['line'] = i
75 suites.setdefault(test_suite, [])
76 suites[test_suite].append(args)
78 def gen_tests(f):
79 f.write("/*\n"
80 " * This GENERATED file is part of GfxPrim. See LICENSE for legal stuff.\n"
81 " * Do not modify this file directly!\n"
82 " */\n\n"
83 "#include <check.h>\n\n")
85 for suite, tests in suites.iteritems():
86 f.write("/****************************************************************\n"
87 " * Suite %s\n"
88 " */\n\n" % suite)
89 for t in tests:
90 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"
95 "{\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"
109 "{\n"
110 " Suite *s = suite_create(\"%s\");\n" % (suite, suite))
111 for t in tests:
112 f.write(" suite_add_tcase(s, GP_TC_%s_%s());\n" % (suite, t['name']))
113 f.write(" return s;\n"
114 "}\n\n")
116 f.write("/****************************************************************\n"
117 " * Create and add all suites to a SRunner\n"
118 " */\n\n"
119 "void GP_AddSuitesToSRunner(SRunner *sr)\n"
120 "{\n")
121 for suite in suites:
122 f.write(" srunner_add_suite(sr, GP_TS_%s());\n" % suite)
123 f.write("}\n\n")
126 def main():
127 try:
128 opts, args = getopt.gnu_getopt(sys.argv[1:], "c:")
129 except:
130 die("Invalid arguments")
131 cfile = None
132 for opt, val in opts:
133 if opt == '-c':
134 cfile = val
135 if not cfile:
136 die("You must specify: -c <output.c>")
138 for fn in args:
139 try:
140 f = open(fn, 'rt')
141 except:
142 die("Unable to open '%s'" % fn)
143 find_tests(f, fn)
144 f.close()
146 try:
147 f = open(cfile, 'wt')
148 except:
149 die("Unable to open '%s'" % cfile)
150 gen_tests(f)
151 f.close()
153 if __name__ == '__main__':
154 main()