| from clang.cindex import * |
| from .util import get_tu |
| |
| # FIXME: We need support for invalid translation units to test better. |
| |
| def test_diagnostic_warning(): |
| tu = get_tu('int f0() {}\n') |
| assert len(tu.diagnostics) == 1 |
| assert tu.diagnostics[0].severity == Diagnostic.Warning |
| assert tu.diagnostics[0].location.line == 1 |
| assert tu.diagnostics[0].location.column == 11 |
| assert (tu.diagnostics[0].spelling == |
| 'control reaches end of non-void function') |
| |
| def test_diagnostic_note(): |
| # FIXME: We aren't getting notes here for some reason. |
| tu = get_tu('#define A x\nvoid *A = 1;\n') |
| assert len(tu.diagnostics) == 1 |
| assert tu.diagnostics[0].severity == Diagnostic.Warning |
| assert tu.diagnostics[0].location.line == 2 |
| assert tu.diagnostics[0].location.column == 7 |
| assert 'incompatible' in tu.diagnostics[0].spelling |
| # assert tu.diagnostics[1].severity == Diagnostic.Note |
| # assert tu.diagnostics[1].location.line == 1 |
| # assert tu.diagnostics[1].location.column == 11 |
| # assert tu.diagnostics[1].spelling == 'instantiated from' |
| |
| def test_diagnostic_fixit(): |
| tu = get_tu('struct { int f0; } x = { f0 : 1 };') |
| assert len(tu.diagnostics) == 1 |
| assert tu.diagnostics[0].severity == Diagnostic.Warning |
| assert tu.diagnostics[0].location.line == 1 |
| assert tu.diagnostics[0].location.column == 26 |
| assert tu.diagnostics[0].spelling.startswith('use of GNU old-style') |
| assert len(tu.diagnostics[0].fixits) == 1 |
| assert tu.diagnostics[0].fixits[0].range.start.line == 1 |
| assert tu.diagnostics[0].fixits[0].range.start.column == 26 |
| assert tu.diagnostics[0].fixits[0].range.end.line == 1 |
| assert tu.diagnostics[0].fixits[0].range.end.column == 30 |
| assert tu.diagnostics[0].fixits[0].value == '.f0 = ' |
| |
| def test_diagnostic_range(): |
| tu = get_tu('void f() { int i = "a" + 1; }') |
| assert len(tu.diagnostics) == 1 |
| assert tu.diagnostics[0].severity == Diagnostic.Warning |
| assert tu.diagnostics[0].location.line == 1 |
| assert tu.diagnostics[0].location.column == 16 |
| assert tu.diagnostics[0].spelling.startswith('incompatible pointer to') |
| assert len(tu.diagnostics[0].fixits) == 0 |
| assert len(tu.diagnostics[0].ranges) == 1 |
| assert tu.diagnostics[0].ranges[0].start.line == 1 |
| assert tu.diagnostics[0].ranges[0].start.column == 20 |
| assert tu.diagnostics[0].ranges[0].end.line == 1 |
| assert tu.diagnostics[0].ranges[0].end.column == 27 |
| try: |
| tu.diagnostics[0].ranges[1].start.line |
| except IndexError: |
| assert True |
| else: |
| assert False |
| |
| def test_diagnostic_category(): |
| """Ensure that category properties work.""" |
| tu = get_tu('int f(int i) { return 7; }', all_warnings=True) |
| assert len(tu.diagnostics) == 1 |
| d = tu.diagnostics[0] |
| |
| assert d.severity == Diagnostic.Warning |
| assert d.location.line == 1 |
| assert d.location.column == 11 |
| |
| assert d.category_number == 2 |
| assert d.category_name == 'Semantic Issue' |
| |
| def test_diagnostic_option(): |
| """Ensure that category option properties work.""" |
| tu = get_tu('int f(int i) { return 7; }', all_warnings=True) |
| assert len(tu.diagnostics) == 1 |
| d = tu.diagnostics[0] |
| |
| assert d.option == '-Wunused-parameter' |
| assert d.disable_option == '-Wno-unused-parameter' |
| |
| def test_diagnostic_children(): |
| tu = get_tu('void f(int x) {} void g() { f(); }') |
| assert len(tu.diagnostics) == 1 |
| d = tu.diagnostics[0] |
| |
| children = d.children |
| assert len(children) == 1 |
| assert children[0].severity == Diagnostic.Note |
| assert children[0].spelling.endswith('declared here') |
| assert children[0].location.line == 1 |
| assert children[0].location.column == 1 |