File: test_general.py

package info (click to toggle)
pycparser 3.0-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 1,252 kB
  • sloc: python: 8,647; ansic: 1,981; makefile: 12; sh: 11
file content (87 lines) | stat: -rw-r--r-- 2,815 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
import os
import sys
import unittest

sys.path.insert(0, "..")
from pycparser import parse_file, c_ast
from tests.test_util import cpp_supported, cpp_path, cpp_args


# 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
        """
        testdir = os.path.dirname(__file__)
        name = os.path.join(testdir, "c_files", name)
        assert os.path.exists(name)
        return name

    def test_without_cpp(self):
        ast = parse_file(self._find_file("example_c_file.c"))
        self.assertIsInstance(ast, c_ast.FileAST)

    @unittest.skipUnless(cpp_supported(), "cpp only works on Unix")
    def test_with_cpp(self):
        memmgr_path = self._find_file("memmgr.c")
        c_files_path = os.path.dirname(memmgr_path)
        ast = parse_file(
            memmgr_path,
            use_cpp=True,
            cpp_path=cpp_path(),
            cpp_args=cpp_args(f"-I{c_files_path}"),
        )
        self.assertIsInstance(ast, c_ast.FileAST)

        fake_libc = os.path.join(c_files_path, "..", "..", "utils", "fake_libc_include")
        ast2 = parse_file(
            self._find_file("year.c"),
            use_cpp=True,
            cpp_path=cpp_path(),
            cpp_args=cpp_args(f"-I{fake_libc}"),
        )

        self.assertIsInstance(ast2, c_ast.FileAST)

    @unittest.skipUnless(cpp_supported(), "cpp only works on Unix")
    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=cpp_path(),
            cpp_args=cpp_args(f"-I{c_files_path}"),
        )
        self.assertIsInstance(ast, c_ast.FileAST)

    @unittest.skipUnless(cpp_supported(), "cpp only works on Unix")
    def test_no_real_content_after_cpp(self):
        ast = parse_file(
            self._find_file("empty.h"),
            use_cpp=True,
            cpp_path=cpp_path(),
            cpp_args=cpp_args(),
        )
        self.assertIsInstance(ast, c_ast.FileAST)

    @unittest.skipUnless(cpp_supported(), "cpp only works on Unix")
    def test_c11_with_cpp(self):
        c_files_path = os.path.join("tests", "c_files")
        fake_libc = os.path.join(c_files_path, "..", "..", "utils", "fake_libc_include")
        ast = parse_file(
            self._find_file("c11.c"),
            use_cpp=True,
            cpp_path=cpp_path(),
            cpp_args=cpp_args(f"-I{fake_libc}"),
        )
        self.assertIsInstance(ast, c_ast.FileAST)


if __name__ == "__main__":
    unittest.main()