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()))