#!/usr/bin/env python3
# Copyright 2022 The ChromiumOS Authors
# 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

import check_clang_diags
from cros_utils import bugs


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