返回教程正文

配套源码

test_definition.py

app/tests/test_definition.py
generic_can Brick:在 VENTUNO Q 上自定义 CAN 报文app/tests/test_definition.py
Python76 行
"""MessageDefinition静态约束测试。"""

import unittest

from generic_can import CANConfigurationError, MessageDefinition


class MessageDefinitionTests(unittest.TestCase):
    """验证命名报文方向与编解码字段的组合规则。"""

    def test_valid_tx_rx_and_both_definitions(self):
        """
        @description         : 验证三种方向的最小合法定义
        @param self          : 当前测试用例
        @return              : 无
        """
        tx = MessageDefinition(1, direction="tx", fixed_data=b"\x01")
        rx = MessageDefinition(2, direction="rx", decode=lambda data: data)
        both = MessageDefinition(3, direction="both", encode=bytes)
        self.assertTrue(tx.allows_tx)
        self.assertFalse(tx.allows_rx)
        self.assertTrue(rx.allows_rx)
        self.assertTrue(both.allows_tx)
        self.assertTrue(both.allows_rx)

    def test_rejects_conflicting_or_missing_payload_source(self):
        """
        @description         : 验证发送定义必须且只能选择一种DATA来源
        @param self          : 当前测试用例
        @return              : 无
        """
        with self.assertRaises(CANConfigurationError):
            MessageDefinition(1, direction="tx")
        with self.assertRaises(CANConfigurationError):
            MessageDefinition(
                1,
                direction="tx",
                fixed_data=b"\x01",
                encode=bytes,
            )
        with self.assertRaises(CANConfigurationError):
            MessageDefinition(1, direction="tx", fixed_data=2)

    def test_rejects_direction_specific_misuse(self):
        """
        @description         : 验证只收和只发定义不能配置反方向处理函数
        @param self          : 当前测试用例
        @return              : 无
        """
        with self.assertRaises(CANConfigurationError):
            MessageDefinition(1, direction="rx", fixed_data=b"\x01")
        with self.assertRaises(CANConfigurationError):
            MessageDefinition(
                1,
                direction="tx",
                fixed_data=b"\x01",
                decode=bytes,
            )

    def test_match_key_includes_frame_format(self):
        """
        @description         : 验证相同ID的标准帧、扩展帧和FD帧不会混配
        @param self          : 当前测试用例
        @return              : 无
        """
        definition = MessageDefinition(
            0x123,
            direction="rx",
            is_extended=True,
            is_fd=True,
        )
        self.assertEqual(definition.match_key(), (0x123, True, True))


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