def test_extract_duplicated_categories(self): msg = ClangMessage(diagnostic_name='cppcoreguidelines-readability-avoid-goto') formatter = CodeClimateFormatter() categories = formatter._extract_categories(msg, object()) self.assertEqual(2, len(categories)) self.assertIn('Style', categories) self.assertIn('Clarity', categories)
def test_extract_location_lines(self): msg = ClangMessage('/some/file/path.cpp', 100, 2) formatter = CodeClimateFormatter() args = unittest.mock.Mock() args.use_location_lines = True self.assertEqual({ 'path': '/some/file/path.cpp', 'lines': { 'begin': 100 } }, formatter._extract_location(msg, args))
def test_extract_content(self): child1 = ClangMessage('/some/file/path1.cpp', 8, 10, ClangMessage.Level.NOTE, 'Allocated here', '', ['return new A;', ' ^']) msg = ClangMessage('/some/file/path.cpp', 100, 2, ClangMessage.Level.WARNING, 'Memory leak', 'bugprone-undefined-memory-manipulation.SomethingWrong', ['void a(int)', ' ^'], [child1]) formatter = CodeClimateFormatter() self.assertEqual({ 'body': '\n'.join([ '```', 'void a(int)', ' ^', '/some/file/path1.cpp:8:10: Allocated here', 'return new A;', ' ^', '```']) }, formatter._extract_content(msg, object()))
def test_extract_trace_lines(self): child1 = ClangMessage('/some/file/path1.cpp', 8, 10) msg = ClangMessage('/some/file/path.cpp', 100, 2, children=[child1]) formatter = CodeClimateFormatter() args = unittest.mock.Mock() args.use_location_lines = True self.assertEqual({ 'locations': [ { 'path': '/some/file/path1.cpp', 'lines': { 'begin': 8 } } ] }, formatter._extract_trace(msg, args))
def test_format(self): child1 = ClangMessage('/some/file/path1.cpp', 8, 10, ClangMessage.Level.NOTE, 'Allocated here', '', ['return new A;', ' ^']) msg = ClangMessage('/some/file/path.cpp', 100, 2, ClangMessage.Level.WARNING, 'Memory leak', 'bugprone-undefined-memory-manipulation.SomethingWrong', ['void a(int)', ' ^'], [child1]) formatter = CodeClimateFormatter() args = unittest.mock.Mock() args.use_location_lines = True self.assertEqual( """{ "type": "issue", "check_name": "bugprone-undefined-memory-manipulation.SomethingWrong", "description": "Memory leak", "content": { "body": "```\\nvoid a(int)\\n ^\\n/some/file/path1.cpp:8:10: Allocated here\\nreturn new A;\\n ^\\n```" }, "categories": [ "Bug Risk" ], "location": { "path": "/some/file/path.cpp", "lines": { "begin": 100 } }, "trace": { "locations": [ { "path": "/some/file/path1.cpp", "lines": { "begin": 8 } } ] }, "severity": "major", "fingerprint": "f2f6ccb970f2259d10e525b4b5805a5c" }\0 """, formatter.format([msg], args))
def _test_fingerprints_different(self, msg1, msg2): formatter = CodeClimateFormatter() self.assertNotEqual(formatter._generate_fingerprint(msg1), formatter._generate_fingerprint(msg2))
def test_generate_fingerprint_reproducibility(self): msg1 = ClangMessage('path1', line=1) msg2 = ClangMessage('path1', line=1) formatter = CodeClimateFormatter() self.assertEqual(formatter._generate_fingerprint(msg1), formatter._generate_fingerprint(msg2))
def _test_extracting_severity(self, level, severity_str): msg = ClangMessage(level=level) formatter = CodeClimateFormatter() self.assertEqual(severity_str, formatter._extract_severity(msg, object()))
def _test_diagnostic_category(self, diagnostic, category): msg = ClangMessage(diagnostic_name=diagnostic) formatter = CodeClimateFormatter() self.assertIn(category, formatter._extract_categories(msg, object()))