import sys, os import unittest sys.path.insert(0, '..') from pycparser import parse_file, c_ast # Portable cpp path for Windows and Linux/Unix CPPPATH = 'utils/cpp.exe' if sys.platform == 'win32' else 'cpp' # Test successful parsing # class TestParsing(unittest.TestCase): def _find_file(self, name): """ Find a c file by name, taking into account the current dir can be in a couple of typical places """ fullnames = [ os.path.join('c_files', name), os.path.join('tests', 'c_files', name)] for fullname in fullnames: if os.path.exists(fullname): return fullname assert False, "Unreachable" def test_without_cpp(self): ast = parse_file(self._find_file('example_c_file.c')) self.assertTrue(isinstance(ast, c_ast.FileAST)) def test_with_cpp(self): c_files_path = os.path.join('tests', 'c_files') ast = parse_file(self._find_file('memmgr.c'), use_cpp=True, cpp_path=CPPPATH, cpp_args='-I%s' % c_files_path) self.assertTrue(isinstance(ast, c_ast.FileAST)) ast2 = parse_file(self._find_file('year.c'), use_cpp=True, cpp_path=CPPPATH, cpp_args=[ r'-Iutils/fake_libc_include', r'-I../utils/fake_libc_include']) self.assertTrue(isinstance(ast2, c_ast.FileAST)) def test_cpp_funkydir(self): # This test contains Windows specific path escapes if sys.platform != 'win32': return c_files_path = os.path.join('tests', 'c_files') ast = parse_file(self._find_file('simplemain.c'), use_cpp=True, cpp_path=CPPPATH, cpp_args='-I%s' % c_files_path) self.assertTrue(isinstance(ast, c_ast.FileAST)) def test_no_real_content_after_cpp(self): ast = parse_file(self._find_file('empty.h'), use_cpp=True, cpp_path=CPPPATH) self.assertTrue(isinstance(ast, c_ast.FileAST)) if __name__ == '__main__': unittest.main()