| # Licensed under the GPL: https://www.gnu.org/licenses/old-licenses/gpl-2.0.html |
| # For details: https://github.com/PyCQA/pylint/blob/main/LICENSE |
| |
| import sys |
| from unittest import mock |
| |
| import pytest |
| |
| from pylint.checkers import BaseChecker |
| from pylint.constants import WarningScope |
| from pylint.exceptions import InvalidMessageError |
| from pylint.message import MessageDefinition |
| |
| |
| @pytest.mark.parametrize( |
| "msgid,expected", |
| [ |
| ("Q1234", "Bad message type Q in 'Q1234'"), |
| ("W12345", "Invalid message id 'W12345'"), |
| ], |
| ) |
| def test_create_invalid_message_type(msgid, expected): |
| checker_mock = mock.Mock(name="Checker") |
| checker_mock.name = "checker" |
| |
| with pytest.raises(InvalidMessageError) as invalid_message_error: |
| MessageDefinition.check_msgid(msgid) |
| with pytest.raises(InvalidMessageError) as other_invalid_message_error: |
| MessageDefinition(checker_mock, msgid, "msg", "descr", "symbol", "scope") |
| assert str(invalid_message_error.value) == expected |
| assert str(other_invalid_message_error.value) == expected |
| |
| |
| class FalseChecker(BaseChecker): |
| name = "FalseChecker" |
| msgs = { |
| "W1234": ("message one", "msg-symbol-one", "msg description"), |
| "W1235": ( |
| "message two", |
| "msg-symbol-two", |
| "msg description", |
| {"old_names": [("W1230", "msg-symbol-one")]}, |
| ), |
| } |
| |
| |
| class TestMessagesDefinition: |
| @staticmethod |
| def assert_with_fail_msg(msg, expected=True): |
| fail_msg = ( |
| f"With minversion='{msg.minversion}' and maxversion='{msg.maxversion}'," |
| f" and the python interpreter being {sys.version_info} " |
| "the message should{}be emitable" |
| ) |
| if expected: |
| assert msg.may_be_emitted(), fail_msg.format(" ") |
| else: |
| assert not msg.may_be_emitted(), fail_msg.format(" not ") |
| |
| @staticmethod |
| def get_message_definition(): |
| args = [ |
| FalseChecker(), |
| "W1234", |
| "message", |
| "description", |
| "msg-symbol", |
| WarningScope.NODE, |
| ] |
| kwargs = {"minversion": None, "maxversion": None} |
| return MessageDefinition(*args, **kwargs) |
| |
| def test_may_be_emitted(self): |
| major = sys.version_info.major |
| minor = sys.version_info.minor |
| msg = self.get_message_definition() |
| self.assert_with_fail_msg(msg, expected=True) |
| msg.minversion = (major, minor - 1) |
| msg.maxversion = (major, minor + 1) |
| self.assert_with_fail_msg(msg, expected=True) |
| msg.minversion = (major, minor + 1) |
| self.assert_with_fail_msg(msg, expected=False) |
| msg.minversion = (major, minor - 1) |
| self.assert_with_fail_msg(msg, expected=True) |
| msg.maxversion = (major, minor - 1) |
| self.assert_with_fail_msg(msg, expected=False) |
| |
| def test_repr(self): |
| msg = self.get_message_definition() |
| repr_str = str([msg, msg]) |
| assert "W1234" in repr_str |
| assert "msg-symbol" in repr_str |
| expected = "[MessageDefinition:msg-symbol-one (W1234), MessageDefinition:msg-symbol-two (W1235)]" |
| assert str(FalseChecker().messages) == expected |
| |
| def test_str(self): |
| msg = self.get_message_definition() |
| str_msg = str(msg) |
| assert "W1234" in str_msg |
| assert "msg-symbol" in str_msg |
| expected = """MessageDefinition:msg-symbol-one (W1234): |
| message one msg description""" |
| assert str(FalseChecker().messages[0]) == expected |
| |
| def test_format_help(self): |
| msg = self.get_message_definition() |
| major = sys.version_info.major |
| minor = sys.version_info.minor |
| msg.minversion = (major, minor - 1) |
| msg.maxversion = (major, minor + 1) |
| format_str_checker_ref = msg.format_help(checkerref=False) |
| format_str = msg.format_help(checkerref=True) |
| assert str(minor - 1) in format_str |
| assert str(major + 1) in format_str_checker_ref |
| expected_format_help = """:msg-symbol-one (W1234): *message one* |
| msg description""" |
| assert FalseChecker().messages[0].format_help() == expected_format_help |