Home | History | Annotate | Download | only in cindex
      1 from clang.cindex import CompilationDatabase
      2 from clang.cindex import CompilationDatabaseError
      3 from clang.cindex import CompileCommands
      4 from clang.cindex import CompileCommand
      5 import os
      6 import gc
      7 
      8 kInputsDir = os.path.join(os.path.dirname(__file__), 'INPUTS')
      9 
     10 def test_create_fail():
     11     """Check we fail loading a database with an assertion"""
     12     path = os.path.dirname(__file__)
     13     try:
     14       cdb = CompilationDatabase.fromDirectory(path)
     15     except CompilationDatabaseError as e:
     16       assert e.cdb_error == CompilationDatabaseError.ERROR_CANNOTLOADDATABASE
     17     else:
     18       assert False
     19 
     20 def test_create():
     21     """Check we can load a compilation database"""
     22     cdb = CompilationDatabase.fromDirectory(kInputsDir)
     23 
     24 def test_lookup_fail():
     25     """Check file lookup failure"""
     26     cdb = CompilationDatabase.fromDirectory(kInputsDir)
     27     assert cdb.getCompileCommands('file_do_not_exist.cpp') == None
     28 
     29 def test_lookup_succeed():
     30     """Check we get some results if the file exists in the db"""
     31     cdb = CompilationDatabase.fromDirectory(kInputsDir)
     32     cmds = cdb.getCompileCommands('/home/john.doe/MyProject/project.cpp')
     33     assert len(cmds) != 0
     34 
     35 def test_all_compilecommand():
     36     """Check we get all results from the db"""
     37     cdb = CompilationDatabase.fromDirectory(kInputsDir)
     38     cmds = cdb.getAllCompileCommands()
     39     assert len(cmds) == 3
     40     expected = [
     41         { 'wd': '/home/john.doe/MyProject',
     42           'file': '/home/john.doe/MyProject/project.cpp',
     43           'line': ['clang++', '-o', 'project.o', '-c',
     44                    '/home/john.doe/MyProject/project.cpp']},
     45         { 'wd': '/home/john.doe/MyProjectA',
     46           'file': '/home/john.doe/MyProject/project2.cpp',
     47           'line': ['clang++', '-o', 'project2.o', '-c',
     48                    '/home/john.doe/MyProject/project2.cpp']},
     49         { 'wd': '/home/john.doe/MyProjectB',
     50           'file': '/home/john.doe/MyProject/project2.cpp',
     51           'line': ['clang++', '-DFEATURE=1', '-o', 'project2-feature.o', '-c',
     52                    '/home/john.doe/MyProject/project2.cpp']},
     53 
     54         ]
     55     for i in range(len(cmds)):
     56         assert cmds[i].directory == expected[i]['wd']
     57         assert cmds[i].filename == expected[i]['file']
     58         for arg, exp in zip(cmds[i].arguments, expected[i]['line']):
     59             assert arg == exp
     60 
     61 def test_1_compilecommand():
     62     """Check file with single compile command"""
     63     cdb = CompilationDatabase.fromDirectory(kInputsDir)
     64     file = '/home/john.doe/MyProject/project.cpp'
     65     cmds = cdb.getCompileCommands(file)
     66     assert len(cmds) == 1
     67     assert cmds[0].directory == os.path.dirname(file)
     68     assert cmds[0].filename == file
     69     expected = [ 'clang++', '-o', 'project.o', '-c',
     70                  '/home/john.doe/MyProject/project.cpp']
     71     for arg, exp in zip(cmds[0].arguments, expected):
     72         assert arg == exp
     73 
     74 def test_2_compilecommand():
     75     """Check file with 2 compile commands"""
     76     cdb = CompilationDatabase.fromDirectory(kInputsDir)
     77     cmds = cdb.getCompileCommands('/home/john.doe/MyProject/project2.cpp')
     78     assert len(cmds) == 2
     79     expected = [
     80         { 'wd': '/home/john.doe/MyProjectA',
     81           'line': ['clang++', '-o', 'project2.o', '-c',
     82                    '/home/john.doe/MyProject/project2.cpp']},
     83         { 'wd': '/home/john.doe/MyProjectB',
     84           'line': ['clang++', '-DFEATURE=1', '-o', 'project2-feature.o', '-c',
     85                    '/home/john.doe/MyProject/project2.cpp']}
     86         ]
     87     for i in range(len(cmds)):
     88         assert cmds[i].directory == expected[i]['wd']
     89         for arg, exp in zip(cmds[i].arguments, expected[i]['line']):
     90             assert arg == exp
     91 
     92 def test_compilecommand_iterator_stops():
     93     """Check that iterator stops after the correct number of elements"""
     94     cdb = CompilationDatabase.fromDirectory(kInputsDir)
     95     count = 0
     96     for cmd in cdb.getCompileCommands('/home/john.doe/MyProject/project2.cpp'):
     97         count += 1
     98         assert count <= 2
     99 
    100 def test_compilationDB_references():
    101     """Ensure CompilationsCommands are independent of the database"""
    102     cdb = CompilationDatabase.fromDirectory(kInputsDir)
    103     cmds = cdb.getCompileCommands('/home/john.doe/MyProject/project.cpp')
    104     del cdb
    105     gc.collect()
    106     workingdir = cmds[0].directory
    107 
    108 def test_compilationCommands_references():
    109     """Ensure CompilationsCommand keeps a reference to CompilationCommands"""
    110     cdb = CompilationDatabase.fromDirectory(kInputsDir)
    111     cmds = cdb.getCompileCommands('/home/john.doe/MyProject/project.cpp')
    112     del cdb
    113     cmd0 = cmds[0]
    114     del cmds
    115     gc.collect()
    116     workingdir = cmd0.directory
    117 
    118