#!/usr/bin/env python3
# Copyright 2022 The Chromium OS Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

"""Tests for check_clang_diags."""

import unittest
from unittest import mock

from cros_utils import bugs

import check_clang_diags

# pylint: disable=protected-access


class Test(unittest.TestCase):
  """Test class."""

  def test_process_new_diagnostics_ignores_new_tools(self):
    new_state, new_diags = check_clang_diags._process_new_diagnostics(
        old={},
        new={'clang': ['-Wone', '-Wtwo']},
    )
    self.assertEqual(new_state, {'clang': ['-Wone', '-Wtwo']})
    self.assertEqual(new_diags, {})

  def test_process_new_diagnostics_is_a_nop_when_no_changes(self):
    new_state, new_diags = check_clang_diags._process_new_diagnostics(
        old={'clang': ['-Wone', '-Wtwo']},
        new={'clang': ['-Wone', '-Wtwo']},
    )
    self.assertEqual(new_state, {'clang': ['-Wone', '-Wtwo']})
    self.assertEqual(new_diags, {})

  def test_process_new_diagnostics_ignores_removals_and_readds(self):
    new_state, new_diags = check_clang_diags._process_new_diagnostics(
        old={'clang': ['-Wone', '-Wtwo']},
        new={'clang': ['-Wone']},
    )
    self.assertEqual(new_diags, {})
    new_state, new_diags = check_clang_diags._process_new_diagnostics(
        old=new_state,
        new={'clang': ['-Wone', '-Wtwo']},
    )
    self.assertEqual(new_state, {'clang': ['-Wone', '-Wtwo']})
    self.assertEqual(new_diags, {})

  def test_process_new_diagnostics_complains_when_warnings_are_added(self):
    new_state, new_diags = check_clang_diags._process_new_diagnostics(
        old={'clang': ['-Wone']},
        new={'clang': ['-Wone', '-Wtwo']},
    )
    self.assertEqual(new_state, {'clang': ['-Wone', '-Wtwo']})
    self.assertEqual(new_diags, {'clang': ['-Wtwo']})

  @mock.patch.object(bugs, 'CreateNewBug')
  def test_bugs_are_created_as_expected(self, create_new_bug_mock):
    check_clang_diags._file_bugs_for_new_diags({
        'clang': ['-Wone'],
        'clang-tidy': ['bugprone-foo'],
    })

    expected_calls = [
        mock.call(
            component_id=bugs.WellKnownComponents.CrOSToolchainPublic,
            title='Investigate clang check `-Wone`',
            body='\n'.join((
                'It seems that the `-Wone` check was recently added to clang.',
                "It's probably good to TAL at whether this check would be good",
                'for us to enable in e.g., platform2, or across ChromeOS.',
            )),
            assignee=check_clang_diags._DEFAULT_ASSIGNEE,
            cc=check_clang_diags._DEFAULT_CCS,
        ),
        mock.call(
            component_id=bugs.WellKnownComponents.CrOSToolchainPublic,
            title='Investigate clang-tidy check `bugprone-foo`',
            body='\n'.join((
                'It seems that the `bugprone-foo` check was recently added to '
                'clang-tidy.',
                "It's probably good to TAL at whether this check would be good",
                'for us to enable in e.g., platform2, or across ChromeOS.',
            )),
            assignee=check_clang_diags._DEFAULT_ASSIGNEE,
            cc=check_clang_diags._DEFAULT_CCS,
        ),
    ]

    # Don't assertEqual the lists, since the diff is really hard to read for
    # that.
    for actual, expected in zip(create_new_bug_mock.call_args_list,
                                expected_calls):
      self.assertEqual(actual, expected)

    self.assertEqual(len(create_new_bug_mock.call_args_list),
                     len(expected_calls))


if __name__ == '__main__':
  unittest.main()
