def test_encode_unsigned_integer(integer_value, value_bit_size, data_byte_size): if value_bit_size > data_byte_size * 8: with pytest.raises(ValueError): UnsignedIntegerEncoder.as_encoder( value_bit_size=value_bit_size, data_byte_size=data_byte_size, ) return encoder = UnsignedIntegerEncoder.as_encoder( value_bit_size=value_bit_size, data_byte_size=data_byte_size, ) lower_bound, upper_bound = compute_unsigned_integer_bounds(value_bit_size) if not is_integer(integer_value): with pytest.raises(EncodingTypeError): encoder(integer_value) return elif integer_value < lower_bound or integer_value > upper_bound: with pytest.raises(ValueOutOfBounds): encoder(integer_value) return if integer_value >= 0: expected_value = zpad(int_to_big_endian(integer_value), data_byte_size) else: expected_value = fpad(int_to_big_endian(integer_value), data_byte_size) encoded_value = encoder(integer_value) assert encoded_value == expected_value
def test_decode_array_of_unsigned_integers(array_size, array_values): size_bytes = zpad32(int_to_big_endian(array_size)) values_bytes = b''.join( (zpad32(int_to_big_endian(v)) for v in array_values)) stream_bytes = size_bytes + values_bytes decoder = DynamicArrayDecoder.as_decoder( item_decoder=UnsignedIntegerDecoder.as_decoder(value_bit_size=256), ) stream = BytesIO(stream_bytes) if len(array_values) < array_size: with pytest.raises(InsufficientDataBytes): decoder(stream) return actual_values = decoder(stream) assert actual_values == array_values[:array_size]
def test_encode_signed_real(base_integer_value, value_bit_size, high_bit_size, low_bit_size, data_byte_size): if value_bit_size > data_byte_size * 8: with pytest.raises(ValueError): SignedRealEncoder.as_encoder( value_bit_size=value_bit_size, high_bit_size=high_bit_size, low_bit_size=low_bit_size, data_byte_size=data_byte_size, ) return elif high_bit_size + low_bit_size != value_bit_size: with pytest.raises(ValueError): SignedRealEncoder.as_encoder( value_bit_size=value_bit_size, high_bit_size=high_bit_size, low_bit_size=low_bit_size, data_byte_size=data_byte_size, ) return encoder = SignedRealEncoder.as_encoder( value_bit_size=value_bit_size, high_bit_size=high_bit_size, low_bit_size=low_bit_size, data_byte_size=data_byte_size, ) if not is_number(base_integer_value): with pytest.raises(EncodingTypeError) as exception_info: encoder(base_integer_value) assert 'SignedReal' in str(exception_info.value) return unsigned_integer_value = base_integer_value % 2**(high_bit_size + low_bit_size) with decimal.localcontext(abi_decimal_context): real_value = decimal.Decimal(unsigned_integer_value) / 2 ** low_bit_size lower_bound, upper_bound = compute_signed_real_bounds( high_bit_size, low_bit_size, ) if real_value < lower_bound or real_value > upper_bound: with pytest.raises(ValueOutOfBounds): encoder(real_value) return expected_value = zpad(int_to_big_endian(unsigned_integer_value), data_byte_size) encoded_value = encoder(real_value) assert encoded_value == expected_value
def test_encode_unsigned_real(base_integer_value, value_bit_size, high_bit_size, low_bit_size, data_byte_size): if value_bit_size > data_byte_size * 8: with pytest.raises(ValueError): UnsignedRealEncoder.as_encoder( value_bit_size=value_bit_size, high_bit_size=high_bit_size, low_bit_size=low_bit_size, data_byte_size=data_byte_size, ) return elif high_bit_size + low_bit_size != value_bit_size: with pytest.raises(ValueError): UnsignedRealEncoder.as_encoder( value_bit_size=value_bit_size, high_bit_size=high_bit_size, low_bit_size=low_bit_size, data_byte_size=data_byte_size, ) return encoder = UnsignedRealEncoder.as_encoder( value_bit_size=value_bit_size, high_bit_size=high_bit_size, low_bit_size=low_bit_size, data_byte_size=data_byte_size, ) if not is_number(base_integer_value): with pytest.raises(EncodingTypeError): encoder(base_integer_value) return real_value = decimal.Decimal(base_integer_value) / 2**low_bit_size lower_bound, upper_bound = compute_unsigned_real_bounds( high_bit_size, low_bit_size, ) if real_value < lower_bound or real_value > upper_bound: with pytest.raises(ValueOutOfBounds): encoder(base_integer_value) return expected_value = zpad(int_to_big_endian(base_integer_value), data_byte_size) encoded_value = encoder(real_value) assert encoded_value == expected_value
def test_decode_bytes_and_string(string_bytes, pad_size): size_bytes = zpad32(int_to_big_endian(len(string_bytes))) padded_string_bytes = string_bytes + b'\x00' * pad_size stream_bytes = size_bytes + padded_string_bytes stream = BytesIO(stream_bytes) decoder = StringDecoder.as_decoder() if len(padded_string_bytes) < ceil32(len(string_bytes)): with pytest.raises(InsufficientDataBytes): decoder(stream) return decoded_value = decoder(stream) assert decoded_value == string_bytes
def encode_fn(cls, value): scaled_value = value * 2**cls.low_bit_size integer_value = int(scaled_value) unsigned_integer_value = integer_value % 2**(cls.high_bit_size + cls.low_bit_size) return int_to_big_endian(unsigned_integer_value)
def encode_fn(cls, value): scaled_value = value * 2**cls.low_bit_size integer_value = int(scaled_value) return int_to_big_endian(integer_value)
def encode_fn(cls, value): return int_to_big_endian(value % 2**cls.value_bit_size)