import sys sys.path.append('src/') from nameHandling.base import ComponentName, NameStyleBproto from protocol_components.message import FactoryMessage, Message from protocol_components.field import FactoryField from errors import BprotoDuplicateNameError, BprotoMessageIDAlreadyUsed def test_message_factory(): factory = FactoryMessage() field1 = FactoryField().assemble("field1", 0, "uint64", 4, None) field2 = FactoryField().assemble("field2", 1, "uint64", 4, None) field3 = FactoryField().assemble("field3", 2, "uint64", 4, None) field4 = FactoryField().assemble("field4", 3, "uint64", 4, None) factory.add_field(field3) factory.add_field(field2) factory.add_field(field4) factory.add_field(field1) message: Message = factory.assemble("TestMessage", 42) assert message.name == "TestMessage" assert isinstance(message.name, ComponentName) assert isinstance(message.get_name(), ComponentName) assert message.message_index_number == 42 assert message.get_identifier() == 42 assert message.fields == { NameStyleBproto.fromStr("field1"): field1, NameStyleBproto.fromStr("field2"): field2, NameStyleBproto.fromStr("field3"): field3, NameStyleBproto.fromStr("field4"): field4 } assert isinstance(list(message.fields.keys())[0], ComponentName) assert message.get_size_bytes() == 8 * 4 * 4 assert message.get_size_bits() == 64 * 4 * 4 def test_message_factory_error_duplicate_name(): field1 = FactoryField().assemble("field1", 0, "uint64", 4, None) field2 = FactoryField().assemble("field1", 1, "uint64", 4, None) factory = FactoryMessage() factory.add_field(field1) factory.add_field(field2) try: factory.assemble("TestMessage", 42) assert False except Exception as e: assert isinstance(e, BprotoDuplicateNameError) def test_message_factory_error_duplicate_index(): field1 = FactoryField().assemble("field1", 0, "uint64", 4, None) field2 = FactoryField().assemble("field2", 0, "uint64", 4, None) factory = FactoryMessage() factory.add_field(field1) factory.add_field(field2) try: factory.assemble("TestMessage", 42) assert False except Exception as e: assert isinstance(e, BprotoMessageIDAlreadyUsed)