summaryrefslogtreecommitdiff
path: root/tools/debug-debug-scripts
diff options
context:
space:
mode:
Diffstat (limited to 'tools/debug-debug-scripts')
-rwxr-xr-xtools/debug-debug-scripts99
1 files changed, 99 insertions, 0 deletions
diff --git a/tools/debug-debug-scripts b/tools/debug-debug-scripts
new file mode 100755
index 0000000..79520e9
--- /dev/null
+++ b/tools/debug-debug-scripts
@@ -0,0 +1,99 @@
+#!/usr/bin/env python
+
+from __future__ import print_function
+
+import itertools
+import os
+import subprocess
+import sys
+import tempfile
+
+error = False
+
+def eprint(s):
+ print('Error:', s, file=sys.stderr)
+
+def get_classes_from_file(a):
+ global error
+ d = {}
+ execfile(a, d)
+ for (k, v) in sorted(d.items()):
+ try:
+ name = v.name
+ except AttributeError:
+ if hasattr(v, 'enabled') and hasattr(v, 'tests'):
+ name = 'None::' + k
+ else:
+ continue
+ else:
+ if name.split('::')[-1] != k:
+ eprint('Mismatch: class %s is for %s' % (k, name))
+ error = True
+ if not v.enabled:
+ eprint('Disabled: %s' % name)
+ continue
+
+ try:
+ tests = v.tests
+ except AttributeError:
+ eprint('Unimplemented tests for %s' % name)
+ error = True
+ continue
+ extra = getattr(v, 'test_extra', '').rstrip(' ')
+ yield (k, tests, extra)
+
+def c_quote(s):
+ s = s.replace('\\', '\\\\')
+ s = s.replace('"', '\\"')
+ return '"' + s + '"'
+
+def gen_test(name, expr, expected):
+ print('static')
+ print('void %s()' % name)
+ print('{')
+ print(' auto value = %s;' % expr)
+ print(' const char *expected = %s;' % c_quote(expected))
+ print(' do_breakpoint(value, expected);')
+ print('}')
+
+def main(args):
+ print('// Generated by', __file__)
+ print('#include <cstdio>')
+ print()
+ print('template<class T>')
+ print('__attribute__((noinline))')
+ print('void do_breakpoint(const T& value, const char *expected)')
+ print('{')
+ print(' (void)value;')
+ print(' (void)expected;')
+ print(' if (!expected) printf("printer test: %p = %s\\n", &value, expected);')
+ print('}')
+
+ names = []
+ for a in args:
+ basename, ext = os.path.splitext(a)
+ assert ext == '.py'
+ print()
+ print('// Tests from', a)
+ header = basename + '.hpp'
+ print('#include "%s"' % header)
+
+ for (k, tests, extra) in get_classes_from_file(a):
+ print()
+ print('// Tests for', k)
+ print(extra)
+ for (i, (expr, expected)) in enumerate(tests):
+ name = 'testset_%s_subtest_%d' % (k, i)
+ gen_test(name, expr, expected)
+ names.append(name)
+ print('int main()')
+ print('{')
+ for n in names:
+ print(' %s();' % n)
+ print('}')
+ if error and not os.getenv('TMWA_FORCE_GENERATE'):
+ sys.exit(1)
+
+
+if __name__ == '__main__':
+ main(sys.argv[1:])