def test_writing_overflow(self): with self.assertRaises(OverflowError): self.assertFieldToStreamEqual(None, 1000, IntegerField(1, 'little')) with self.assertRaises(OverflowError): self.assertFieldToStreamEqual(None, -1000, IntegerField(1, 'little'))
def test_override_on_inner_field(self): self.assertEqual( 3, ConstantField(0xf1, base_field=IntegerField(length=1, override=3)).override) self.assertEqual( 3, ConstantField(0xf1, base_field=IntegerField(length=1), override=3).override)
def test_basic(self): self.assertFieldStreamEqual(b'\x01\0', 256, IntegerField(2, 'big')) self.assertFieldStreamEqual(b'\x01\0', 1, IntegerField(2, 'little')) self.assertFieldStreamEqual(b'\xff\xfe', -257, IntegerField(2, 'little', signed=True)) self.assertFieldStreamEqual(b'\xff\xfe', 65534, IntegerField(2, 'big', signed=False)) self.assertFieldStreamEqual(b'\xfe\xff', -257, IntegerField(2, 'big', signed=True))
def test_based_on_other_field(self): self.assertFieldStreamEqual( b"\xf1", 0xf1, ConstantField(0xf1, base_field=IntegerField(length=1))) with self.assertRaises(WrongMagicError): self.call_field_from_stream( ConstantField(0xf1, base_field=IntegerField(length=1)), b"\xf2") with self.assertRaises(WriteError): self.call_field_to_stream( ConstantField(0xf1, base_field=IntegerField(length=1)), 12)
def test_encode_on_inner_field(self): self.assertFieldStreamEqual( b'\x24', 0x12, ConstantField(0x12, base_field=IntegerField(length=1, encoder=lambda x: x + 0x12, decoder=lambda x: x - 0x12)))
def test_conditional_field_encoder(self): self.assertFieldStreamEqual( b'\x11', 0x01, ConditionalField(IntegerField(1, encoder=lambda x: x + 0x10, decoder=lambda x: x - 0x10), condition=True))
def test_incorrect_length(self): with self.assertRaises(StreamExhaustedError): self.call_field_from_stream(ArrayField(IntegerField(1), length=2, name='field'), b"\x01", field_values={'field': None}) with self.assertRaises(WriteError): self.call_field_to_stream(ArrayField(IntegerField(1), length=2, name='field'), [2], field_values={'field': None}) with self.assertRaises(WriteError): self.call_field_to_stream(ArrayField(IntegerField(1), length=2, name='field'), [2, 3, 4], field_values={'field': None})
def test_until(self): self.assertFieldFromStreamEqual(b"\x01\x01\x02\x01", [1, 1, 2], ArrayField(IntegerField(1), until=lambda c, v: v == 2, name='field'), parsed_fields={'field': None}) with self.assertRaises(StreamExhaustedError): self.assertFieldFromStreamEqual(b"\x01\x01\x02\x01", [1, 1, 2], ArrayField( IntegerField(1), until=lambda c, v: False, name='field'), parsed_fields={'field': None}) self.assertFieldFromStreamEqual(b"\x01\x01\x02\x01", [1, 1, 2], ArrayField(IntegerField(1), count=3, until=lambda c, v: False, name='field'), parsed_fields={'field': None})
def test_length(self): self.assertFieldStreamEqual(b"\x02\x01\x00\x01", [513, 1], ArrayField(IntegerField(2, 'big'), length=4, name='field'), parsed_fields={'field': None}) self.assertFieldStreamEqual(b"\x02\x01\x00\x01", [b"\x02\x01\x00\x01"], ArrayField(FixedLengthField(-1), length=4, name='field'), parsed_fields={'field': None}) self.assertFieldStreamEqual(b"\x02\x01\x00\x01", [b"\x02\x01", b"\x00\x01"], ArrayField(FixedLengthField(2), length=4, name='field'), parsed_fields={'field': None}) self.assertFieldStreamEqual(b"\x02\x01\x00\x01", [b"\x02\x01", b"\x00\x01"], ArrayField(FixedLengthField(2), length=-1, name='field'), parsed_fields={'field': None})
def test_basic_switch(self): self.assertFieldStreamEqual( b"\x01", 1, SwitchField(cases={ 1: IntegerField(1), 2: IntegerField(2, 'little') }, switch=1)) self.assertFieldStreamEqual( b"\x01\x01", 0x0101, SwitchField(cases={ 1: IntegerField(1), 2: IntegerField(2, 'little') }, switch=2)) self.assertFieldStreamEqual(b"\x01", 1, SwitchField(cases={ 1: IntegerField(1), 2: IntegerField(2, 'little') }, switch='c'), parsed_fields={'c': 1})
class Struct3(Structure): num = IntegerField(2) class Meta: byte_order = 'big'
class ConditionalStructure(Structure): condition = ByteField() value = ConditionalField(ConstantField(1, IntegerField(1)), condition='condition')
class Struct2(Structure): num = IntegerField(2) class Meta: byte_order = 'little'
class Struct(Structure): x = ArrayField(IntegerField(2), count=2) class Meta: byte_order = 'big'
class Struct(Structure): len = IntegerField(length=1, byte_order='little', override=lambda c, v: v) str1 = BytesField(length='len')
class TestStruct(Structure): length = IntegerField(1, signed=False) numbers = ArrayField(IntegerField(length=1), count='length')
class Struct(Structure): len = IntegerField(length=1, byte_order='little') str1 = BytesField(length='len')
def test_count(self): self.assertFieldStreamEqual(b"\x02\x01\x00\x01", [513, 1], ArrayField(IntegerField(2, 'big'), count=2, name='field'), parsed_fields={'field': None})
class ConditionalStructure(Structure): condition = ByteField() value = ConditionalField(IntegerField(2, 'big'), condition='condition')
class TestStructure(Structure): field1 = IntegerField(length=1, decoder=lambda x: x + 10, lazy=True)
class SubStructure(Structure): length = IntegerField(1, signed=False) numbers = ArrayField(FixedLengthField(length=lambda s: s.length), count='length')
def test_switch_other(self): self.assertFieldStreamEqual( b"\x01", 1, SwitchField(cases={}, other=IntegerField(1), switch=1))
class EnumStructure(Structure): flag = EnumField(IntegerField(1), enum=Flags)
def test_len(self): self.assertEqual(50, len(ArrayField(IntegerField(2, 'big'), count=25)))
class Struct(Structure): num = IntegerField(1)
class Struct2(Structure): length = IntegerField(length=1, override=lambda c, v: len(c.s2.b)) s2 = StructureField(Struct1)
class EnumStructure(Structure): flag = EnumField(IntegerField(1, default=Flags.X), enum=Flags)
class TestStruct(Structure): numbers = ArrayField(IntegerField(length=1), count=3)
class TestStruct(Structure): length = IntegerField(1) content = FixedLengthField(this.length)
class TestStructure(Structure): field2 = FixedLengthField(length='length', lazy=True) field3 = FixedLengthField(length=1) length = IntegerField(offset=-1, length=1, lazy=True)