1e5dd7070Spatrickimport os 2e5dd7070Spatrickfrom clang.cindex import Config 3e5dd7070Spatrickif 'CLANG_LIBRARY_PATH' in os.environ: 4e5dd7070Spatrick Config.set_library_path(os.environ['CLANG_LIBRARY_PATH']) 5e5dd7070Spatrick 6e5dd7070Spatrickfrom clang.cindex import * 7e5dd7070Spatrickfrom .util import get_tu 8e5dd7070Spatrick 9e5dd7070Spatrickimport unittest 10e5dd7070Spatrick 11e5dd7070Spatrick 12e5dd7070Spatrick# FIXME: We need support for invalid translation units to test better. 13e5dd7070Spatrick 14e5dd7070Spatrick 15e5dd7070Spatrickclass TestDiagnostics(unittest.TestCase): 16e5dd7070Spatrick def test_diagnostic_warning(self): 17e5dd7070Spatrick tu = get_tu('int f0() {}\n') 18e5dd7070Spatrick self.assertEqual(len(tu.diagnostics), 1) 19e5dd7070Spatrick self.assertEqual(tu.diagnostics[0].severity, Diagnostic.Warning) 20e5dd7070Spatrick self.assertEqual(tu.diagnostics[0].location.line, 1) 21e5dd7070Spatrick self.assertEqual(tu.diagnostics[0].location.column, 11) 22e5dd7070Spatrick self.assertEqual(tu.diagnostics[0].spelling, 23e5dd7070Spatrick 'non-void function does not return a value') 24e5dd7070Spatrick 25e5dd7070Spatrick def test_diagnostic_note(self): 26e5dd7070Spatrick # FIXME: We aren't getting notes here for some reason. 27e5dd7070Spatrick tu = get_tu('#define A x\nvoid *A = 1;\n') 28e5dd7070Spatrick self.assertEqual(len(tu.diagnostics), 1) 29*12c85518Srobert self.assertEqual(tu.diagnostics[0].severity, Diagnostic.Error) 30e5dd7070Spatrick self.assertEqual(tu.diagnostics[0].location.line, 2) 31e5dd7070Spatrick self.assertEqual(tu.diagnostics[0].location.column, 7) 32e5dd7070Spatrick self.assertIn('incompatible', tu.diagnostics[0].spelling) 33e5dd7070Spatrick# self.assertEqual(tu.diagnostics[1].severity, Diagnostic.Note) 34e5dd7070Spatrick# self.assertEqual(tu.diagnostics[1].location.line, 1) 35e5dd7070Spatrick# self.assertEqual(tu.diagnostics[1].location.column, 11) 36e5dd7070Spatrick# self.assertEqual(tu.diagnostics[1].spelling, 'instantiated from') 37e5dd7070Spatrick 38e5dd7070Spatrick def test_diagnostic_fixit(self): 39e5dd7070Spatrick tu = get_tu('struct { int f0; } x = { f0 : 1 };') 40e5dd7070Spatrick self.assertEqual(len(tu.diagnostics), 1) 41e5dd7070Spatrick self.assertEqual(tu.diagnostics[0].severity, Diagnostic.Warning) 42e5dd7070Spatrick self.assertEqual(tu.diagnostics[0].location.line, 1) 43e5dd7070Spatrick self.assertEqual(tu.diagnostics[0].location.column, 26) 44a9ac8606Spatrick self.assertRegex(tu.diagnostics[0].spelling, 45e5dd7070Spatrick 'use of GNU old-style.*') 46e5dd7070Spatrick self.assertEqual(len(tu.diagnostics[0].fixits), 1) 47e5dd7070Spatrick self.assertEqual(tu.diagnostics[0].fixits[0].range.start.line, 1) 48e5dd7070Spatrick self.assertEqual(tu.diagnostics[0].fixits[0].range.start.column, 26) 49e5dd7070Spatrick self.assertEqual(tu.diagnostics[0].fixits[0].range.end.line, 1) 50e5dd7070Spatrick self.assertEqual(tu.diagnostics[0].fixits[0].range.end.column, 30) 51e5dd7070Spatrick self.assertEqual(tu.diagnostics[0].fixits[0].value, '.f0 = ') 52e5dd7070Spatrick 53e5dd7070Spatrick def test_diagnostic_range(self): 54e5dd7070Spatrick tu = get_tu('void f() { int i = "a"; }') 55e5dd7070Spatrick self.assertEqual(len(tu.diagnostics), 1) 56*12c85518Srobert self.assertEqual(tu.diagnostics[0].severity, Diagnostic.Error) 57e5dd7070Spatrick self.assertEqual(tu.diagnostics[0].location.line, 1) 58e5dd7070Spatrick self.assertEqual(tu.diagnostics[0].location.column, 16) 59a9ac8606Spatrick self.assertRegex(tu.diagnostics[0].spelling, 60e5dd7070Spatrick 'incompatible pointer to.*') 61e5dd7070Spatrick self.assertEqual(len(tu.diagnostics[0].fixits), 0) 62e5dd7070Spatrick self.assertEqual(len(tu.diagnostics[0].ranges), 1) 63e5dd7070Spatrick self.assertEqual(tu.diagnostics[0].ranges[0].start.line, 1) 64e5dd7070Spatrick self.assertEqual(tu.diagnostics[0].ranges[0].start.column, 20) 65e5dd7070Spatrick self.assertEqual(tu.diagnostics[0].ranges[0].end.line, 1) 66e5dd7070Spatrick self.assertEqual(tu.diagnostics[0].ranges[0].end.column, 23) 67e5dd7070Spatrick with self.assertRaises(IndexError): 68e5dd7070Spatrick tu.diagnostics[0].ranges[1].start.line 69e5dd7070Spatrick 70e5dd7070Spatrick def test_diagnostic_category(self): 71e5dd7070Spatrick """Ensure that category properties work.""" 72e5dd7070Spatrick tu = get_tu('int f(int i) { return 7; }', all_warnings=True) 73e5dd7070Spatrick self.assertEqual(len(tu.diagnostics), 1) 74e5dd7070Spatrick d = tu.diagnostics[0] 75e5dd7070Spatrick 76e5dd7070Spatrick self.assertEqual(d.severity, Diagnostic.Warning) 77e5dd7070Spatrick self.assertEqual(d.location.line, 1) 78e5dd7070Spatrick self.assertEqual(d.location.column, 11) 79e5dd7070Spatrick 80e5dd7070Spatrick self.assertEqual(d.category_number, 2) 81e5dd7070Spatrick self.assertEqual(d.category_name, 'Semantic Issue') 82e5dd7070Spatrick 83e5dd7070Spatrick def test_diagnostic_option(self): 84e5dd7070Spatrick """Ensure that category option properties work.""" 85e5dd7070Spatrick tu = get_tu('int f(int i) { return 7; }', all_warnings=True) 86e5dd7070Spatrick self.assertEqual(len(tu.diagnostics), 1) 87e5dd7070Spatrick d = tu.diagnostics[0] 88e5dd7070Spatrick 89e5dd7070Spatrick self.assertEqual(d.option, '-Wunused-parameter') 90e5dd7070Spatrick self.assertEqual(d.disable_option, '-Wno-unused-parameter') 91e5dd7070Spatrick 92e5dd7070Spatrick def test_diagnostic_children(self): 93e5dd7070Spatrick tu = get_tu('void f(int x) {} void g() { f(); }') 94e5dd7070Spatrick self.assertEqual(len(tu.diagnostics), 1) 95e5dd7070Spatrick d = tu.diagnostics[0] 96e5dd7070Spatrick 97e5dd7070Spatrick children = d.children 98e5dd7070Spatrick self.assertEqual(len(children), 1) 99e5dd7070Spatrick self.assertEqual(children[0].severity, Diagnostic.Note) 100a9ac8606Spatrick self.assertRegex(children[0].spelling, 101e5dd7070Spatrick '.*declared here') 102e5dd7070Spatrick self.assertEqual(children[0].location.line, 1) 103ec727ea7Spatrick self.assertEqual(children[0].location.column, 6) 104e5dd7070Spatrick 105e5dd7070Spatrick def test_diagnostic_string_repr(self): 106e5dd7070Spatrick tu = get_tu('struct MissingSemicolon{}') 107e5dd7070Spatrick self.assertEqual(len(tu.diagnostics), 1) 108e5dd7070Spatrick d = tu.diagnostics[0] 109e5dd7070Spatrick 110e5dd7070Spatrick self.assertEqual(repr(d), '<Diagnostic severity 3, location <SourceLocation file \'t.c\', line 1, column 26>, spelling "expected \';\' after struct">') 111