* A couple of bug fixes in c-to-c.py (Issue 35, and comlex types in function argument declarations)
* added unit tests for c-to-c.py
diff --git a/examples/tests/test_c-to-c.py b/examples/tests/test_c-to-c.py
new file mode 100644
index 0000000..4cd13ba
--- /dev/null
+++ b/examples/tests/test_c-to-c.py
@@ -0,0 +1,80 @@
+#!/usr/bin/env python
+
+import sys
+import unittest
+
+sys.path.insert(0, '..') # for c-to-c.py
+sys.path.insert(0, '../..') # for pycparser libs
+
+from pycparser import c_parser
+c2cmodule = __import__('c-to-c')
+
+_c_parser = c_parser.CParser(
+ lex_optimize=False,
+ yacc_debug=True,
+ yacc_optimize=False,
+ yacctab='yacctab')
+
+
+def compare_asts(ast1, ast2):
+ if type(ast1) != type(ast2):
+ return False
+ for attr in ast1.attr_names:
+ if getattr(ast1, attr) != getattr(ast2, attr):
+ return False
+ for i, c1 in enumerate(ast1.children()):
+ if compare_asts(c1, ast2.children()[i]) == False:
+ return False
+ return True
+
+
+def parse_to_ast(src):
+ return _c_parser.parse(src)
+
+
+class TestCtoC(unittest.TestCase):
+ def _run_c_to_c(self, src):
+ ast = parse_to_ast(src)
+ generator = c2cmodule.CGenerator()
+ return generator.visit(ast)
+
+ def _assert_ctoc_correct(self, src):
+ """ Checks that the c2c translation was correct by parsing the code
+ generated by c2c for src and comparing the AST with the original
+ AST.
+ """
+ src2 = self._run_c_to_c(src)
+ self.assertTrue(compare_asts(parse_to_ast(src), parse_to_ast(src2)), src2)
+
+ def test_trivial_decls(self):
+ self._assert_ctoc_correct('int a;')
+ self._assert_ctoc_correct('int b, a;')
+ self._assert_ctoc_correct('int c, b, a;')
+
+ def test_complex_decls(self):
+ self._assert_ctoc_correct('int** (*a)(void);')
+ self._assert_ctoc_correct('int** (*a)(void*, int);')
+
+ def test_casts(self):
+ self._assert_ctoc_correct(r'''
+ int main() {
+ int b = (int) f;
+ int c = (int*) f;
+ }''')
+
+ def test_initlist(self):
+ self._assert_ctoc_correct('int arr[] = {1, 2, 3};')
+
+ def test_statements(self):
+ self._assert_ctoc_correct(r'''
+ int main() {
+ int a;
+ a = 5;
+ return a;
+ }''')
+
+
+
+
+if __name__ == "__main__":
+ unittest.main()