summaryrefslogtreecommitdiff
path: root/bindings/python/tests/cindex/test_cdb.py
blob: 35fe3e108a12e4b749bb4b6810af8208e24924e9 (plain)
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
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
from clang.cindex import CompilationDatabase
from clang.cindex import CompilationDatabaseError
from clang.cindex import CompileCommands
from clang.cindex import CompileCommand
import os
import gc

kInputsDir = os.path.join(os.path.dirname(__file__), 'INPUTS')

def test_create_fail():
    """Check we fail loading a database with an assertion"""
    path = os.path.dirname(__file__)
    try:
      cdb = CompilationDatabase.fromDirectory(path)
    except CompilationDatabaseError as e:
      assert e.cdb_error == CompilationDatabaseError.ERROR_CANNOTLOADDATABASE
    else:
      assert False

def test_create():
    """Check we can load a compilation database"""
    cdb = CompilationDatabase.fromDirectory(kInputsDir)

def test_lookup_fail():
    """Check file lookup failure"""
    cdb = CompilationDatabase.fromDirectory(kInputsDir)
    assert cdb.getCompileCommands('file_do_not_exist.cpp') == None

def test_lookup_succeed():
    """Check we get some results if the file exists in the db"""
    cdb = CompilationDatabase.fromDirectory(kInputsDir)
    cmds = cdb.getCompileCommands('/home/john.doe/MyProject/project.cpp')
    assert len(cmds) != 0

def test_all_compilecommand():
    """Check we get all results from the db"""
    cdb = CompilationDatabase.fromDirectory(kInputsDir)
    cmds = cdb.getAllCompileCommands()
    assert len(cmds) == 3
    expected = [
        { 'wd': '/home/john.doe/MyProject',
          'file': '/home/john.doe/MyProject/project.cpp',
          'line': ['clang++', '-o', 'project.o', '-c',
                   '/home/john.doe/MyProject/project.cpp']},
        { 'wd': '/home/john.doe/MyProjectA',
          'file': '/home/john.doe/MyProject/project2.cpp',
          'line': ['clang++', '-o', 'project2.o', '-c',
                   '/home/john.doe/MyProject/project2.cpp']},
        { 'wd': '/home/john.doe/MyProjectB',
          'file': '/home/john.doe/MyProject/project2.cpp',
          'line': ['clang++', '-DFEATURE=1', '-o', 'project2-feature.o', '-c',
                   '/home/john.doe/MyProject/project2.cpp']},

        ]
    for i in range(len(cmds)):
        assert cmds[i].directory == expected[i]['wd']
        assert cmds[i].filename == expected[i]['file']
        for arg, exp in zip(cmds[i].arguments, expected[i]['line']):
            assert arg == exp

def test_1_compilecommand():
    """Check file with single compile command"""
    cdb = CompilationDatabase.fromDirectory(kInputsDir)
    file = '/home/john.doe/MyProject/project.cpp'
    cmds = cdb.getCompileCommands(file)
    assert len(cmds) == 1
    assert cmds[0].directory == os.path.dirname(file)
    assert cmds[0].filename == file
    expected = [ 'clang++', '-o', 'project.o', '-c',
                 '/home/john.doe/MyProject/project.cpp']
    for arg, exp in zip(cmds[0].arguments, expected):
        assert arg == exp

def test_2_compilecommand():
    """Check file with 2 compile commands"""
    cdb = CompilationDatabase.fromDirectory(kInputsDir)
    cmds = cdb.getCompileCommands('/home/john.doe/MyProject/project2.cpp')
    assert len(cmds) == 2
    expected = [
        { 'wd': '/home/john.doe/MyProjectA',
          'line': ['clang++', '-o', 'project2.o', '-c',
                   '/home/john.doe/MyProject/project2.cpp']},
        { 'wd': '/home/john.doe/MyProjectB',
          'line': ['clang++', '-DFEATURE=1', '-o', 'project2-feature.o', '-c',
                   '/home/john.doe/MyProject/project2.cpp']}
        ]
    for i in range(len(cmds)):
        assert cmds[i].directory == expected[i]['wd']
        for arg, exp in zip(cmds[i].arguments, expected[i]['line']):
            assert arg == exp

def test_compilecommand_iterator_stops():
    """Check that iterator stops after the correct number of elements"""
    cdb = CompilationDatabase.fromDirectory(kInputsDir)
    count = 0
    for cmd in cdb.getCompileCommands('/home/john.doe/MyProject/project2.cpp'):
        count += 1
        assert count <= 2

def test_compilationDB_references():
    """Ensure CompilationsCommands are independent of the database"""
    cdb = CompilationDatabase.fromDirectory(kInputsDir)
    cmds = cdb.getCompileCommands('/home/john.doe/MyProject/project.cpp')
    del cdb
    gc.collect()
    workingdir = cmds[0].directory

def test_compilationCommands_references():
    """Ensure CompilationsCommand keeps a reference to CompilationCommands"""
    cdb = CompilationDatabase.fromDirectory(kInputsDir)
    cmds = cdb.getCompileCommands('/home/john.doe/MyProject/project.cpp')
    del cdb
    cmd0 = cmds[0]
    del cmds
    gc.collect()
    workingdir = cmd0.directory