def test_encode_at_least_more(self, Message): array = messages.MessageArrayField( "", Message, messages.MessageArrayField.at_least(3)) elements = [Message(byte=255, short=0x11AA)] * 5 encoded = array.encode(elements) assert isinstance(encoded, bytes) assert encoded == elements[0].encode() * 5
def test_encode_value_of(self, Message): array = messages.MessageArrayField( "", Message, messages.MessageArrayField.value_of("life")) elements = [Message(byte=255, short=0x11AA)] * 5 encoded = array.encode(elements, {"life": 5}) assert isinstance(encoded, bytes) assert encoded == elements[0].encode() * 5
def test_decode_insufficient_buffer(self): class Message(messages.Message): fields = messages.ByteField("field"), array = messages.MessageArrayField("", Message, 5) encoded = b"\xFF\xFE\xFD" with pytest.raises(messages.BrokenMessageError): array.decode(encoded)
def test_deocde_at_least_too_few(self): class Message(messages.Message): fields = messages.ByteField(""), array = messages.MessageArrayField( "", Message, messages.MessageArrayField.at_least(5)) with pytest.raises(messages.BrokenMessageError): array.decode(b"\x00" * 4)
def test_decode_at_least_more(self): class Message(messages.Message): fields = messages.ByteField(""), array = messages.MessageArrayField( "", Message, messages.MessageArrayField.at_least(5)) values, remnants = array.decode(b"\x00" * 10) assert len(values) == 10 assert not remnants
def test_deocde_all(self): class Message(messages.Message): fields = messages.ByteField(""), array = messages.MessageArrayField("", Message, messages.MessageArrayField.all()) values, remnants = array.decode(b"\x00" * 128) assert len(values) == 128 assert not remnants
def test_encode_invalid_element(self): class Element(messages.Message): fields = () class Borked(messages.Message): fields = () array = messages.MessageArrayField("", Element, 3) with pytest.raises(messages.BrokenMessageError): array.encode([Borked()])
def test_deocde_at_least_remnants(self): class Message(messages.Message): fields = messages.ShortField(""), array = messages.MessageArrayField( "", Message, messages.MessageArrayField.at_least(5)) values, remnants = array.decode((b"\x00\x00" * 10) + b"\xFF") assert len(values) == 10 assert isinstance(remnants, bytes) assert remnants == b"\xFF"
def test_decode_constant(self): class Message(messages.Message): fields = messages.ByteField("field"), array = messages.MessageArrayField("", Message, 5) encoded = b"\x00\x01\x02\x03\x04\x00\x00\x00" values, remnants = array.decode(encoded) for sub_message, expected in zip(values, range(4)): assert sub_message["field"] == expected assert isinstance(remnants, bytes) assert remnants == b"\x00\x00\x00"
def test_decode_minimum_remnants(self): class Message(messages.Message): fields = messages.ShortField("field"), array = messages.MessageArrayField("", Message, 3) array.count.minimum = 2 # Two shorts and a trailing byte encoded = b"\x00\x00\x11\x11\x22" values, remnants = array.decode(encoded) for sub_message, expected in zip(values, [0, 0x1111]): assert sub_message["field"] == expected assert isinstance(remnants, bytes) assert remnants == b"\x22"
def test_decode_minimum(self): class Message(messages.Message): fields = messages.ByteField("field"), array = messages.MessageArrayField("", Message, 5) array.count.minimum = 2 encoded = b"\x00\x01" values, remnants = array.decode(encoded) # Minimum for sub_message, expected in zip(values, range(1)): assert sub_message["field"] == expected assert not remnants encoded += b"\x02\x03\x04" values, remnants = array.decode(encoded) # Maximum for sub_message, expected in zip(values, range(4)): assert sub_message["field"] == expected assert not remnants
def test_encode_all_none(self, Message): array = messages.MessageArrayField("", Message) encoded = array.encode([]) assert isinstance(encoded, bytes) assert len(encoded) == 0
def test_encode_all(self, Message): array = messages.MessageArrayField("", Message) elements = [Message(byte=255, short=0x11AA)] * 10 encoded = array.encode(elements) assert isinstance(encoded, bytes) assert encoded == elements[0].encode() * 10
def test_encode_too_few_elements(self, Message): array = messages.MessageArrayField("", Message, 5) elements = [Message(byte=255, short=0x11AA)] * 3 with pytest.raises(messages.BrokenMessageError): array.encode(elements)
def test_callable_count(self): def function(values={}): pass array = messages.MessageArrayField("", None, function) assert array.count is function
def test_encode_at_least_too_few(self, Message): array = messages.MessageArrayField( "", Message, messages.MessageArrayField.at_least(5)) elements = [Message(byte=255, short=0x11AA)] * 4 with pytest.raises(messages.BrokenMessageError): encoded = array.encode(elements)
class Message(messages.Message): fields = (messages.ByteField("byte"), messages.MessageArrayField("array", Element, count))
def test_constant_count(self): array = messages.MessageArrayField("", None, 5) assert array.count() == 5 assert array.count.minimum == 5