| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110 |
- 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/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']},
- { 'wd': '/home/john.doe/MyProject',
- 'line': ['clang++', '-o', 'project.o', '-c',
- '/home/john.doe/MyProject/project.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_1_compilecommand():
- """Check file with single compile command"""
- cdb = CompilationDatabase.fromDirectory(kInputsDir)
- cmds = cdb.getCompileCommands('/home/john.doe/MyProject/project.cpp')
- assert len(cmds) == 1
- assert cmds[0].directory == '/home/john.doe/MyProject'
- 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
|