blob: 587284a44c53e08b25f99189c112127ffde06e52 [file] [log] [blame]
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()