예제 #1
0
def test_unregister_unknown_lookups(registry: ABIRegistry):
    with pytest.raises(KeyError,
                       match=r'Matcher .* not found in encoder registry'):
        registry.unregister(lambda x: x)
    with pytest.raises(KeyError,
                       match=r'Label .* not found in encoder registry'):
        registry.unregister('foo')
예제 #2
0
def test_can_register_simple_callables(registry: ABIRegistry):
    encode_bool = lambda x: x
    decode_bool = lambda x: x

    registry.register('bool', encode_bool, decode_bool)

    assert registry.get_encoder('bool') is encode_bool
    assert registry.get_decoder('bool') is decode_bool
예제 #3
0
def test_has_encoder_raises(registry: ABIRegistry):
    registry.register(
        BaseEquals('address', with_sub=False),
        encoding.AddressEncoder,
        decoding.AddressDecoder,
        label='other_address',
    )

    with pytest.raises(exceptions.MultipleEntriesFound):
        assert registry.has_encoder('address')
예제 #4
0
def test_can_register_simple_callables(registry: ABIRegistry):
    def encode_bool(x):
        return x

    decode_bool = encode_bool

    registry.register('bool', encode_bool, decode_bool)

    assert registry.get_encoder('bool') is encode_bool
    assert registry.get_decoder('bool') is decode_bool
예제 #5
0
def test_cache_resets_after_unregister_and_unregister_works(
        registry: ABIRegistry):
    # Populate cache
    registry.get_encoder('address')
    registry.get_decoder('address')

    # Perform cache resetting action
    registry.unregister('address')

    # Confirm cache reset
    with pytest.raises(exceptions.NoEntriesFound):
        registry.get_encoder('address')
    with pytest.raises(exceptions.NoEntriesFound):
        registry.get_decoder('address')
예제 #6
0
def test_can_register_and_unregister_string_lookups(registry: ABIRegistry):
    registry.register(
        'bool',
        encoding.BooleanEncoder,
        decoding.BooleanDecoder,
    )

    assert isinstance(registry.get_encoder('bool'), encoding.BooleanEncoder)
    assert isinstance(registry.get_decoder('bool'), decoding.BooleanDecoder)

    registry.unregister('bool')

    with pytest.raises(exceptions.NoEntriesFound):
        registry.get_encoder('bool')
    with pytest.raises(exceptions.NoEntriesFound):
        registry.get_decoder('bool')
예제 #7
0
def test_cache_resets_after_unregister_and_unregister_works(
        registry: ABIRegistry):
    # Populate cache
    registry.get_encoder('address')
    registry.get_decoder('address')

    # Perform cache resetting action
    registry.unregister('address')

    # Confirm cache reset
    with pytest.raises(ValueError,
                       match=r'No matching entries .* encoder registry'):
        registry.get_encoder('address')
    with pytest.raises(ValueError,
                       match=r'No matching entries .* decoder registry'):
        registry.get_decoder('address')
예제 #8
0
def test_cache_resets_after_register_and_register_works(registry: ABIRegistry):
    # Populate cache
    registry.get_encoder('address')
    registry.get_decoder('address')

    # Perform cache resetting action
    registry.register(
        BaseEquals('address', with_sub=False),
        encoding.AddressEncoder,
        decoding.AddressDecoder,
        label='address without sub',
    )

    # Confirm cache reset
    with pytest.raises(exceptions.MultipleEntriesFound):
        registry.get_encoder('address')
    with pytest.raises(exceptions.MultipleEntriesFound):
        registry.get_decoder('address')
예제 #9
0
def test_can_register_and_unregister_string_lookups(registry: ABIRegistry):
    registry.register(
        'bool',
        encoding.BooleanEncoder,
        decoding.BooleanDecoder,
    )

    assert isinstance(registry.get_encoder('bool'), encoding.BooleanEncoder)
    assert isinstance(registry.get_decoder('bool'), decoding.BooleanDecoder)

    registry.unregister('bool')

    with pytest.raises(ValueError,
                       match=r'No matching entries .* encoder registry'):
        registry.get_encoder('bool')
    with pytest.raises(ValueError,
                       match=r'No matching entries .* decoder registry'):
        registry.get_decoder('bool')
예제 #10
0
def test_cache_resets_after_register_and_register_works(registry: ABIRegistry):
    # Populate cache
    registry.get_encoder('address')
    registry.get_decoder('address')

    # Perform cache resetting action
    registry.register(
        BaseEquals('address', with_sub=False),
        encoding.AddressEncoder,
        decoding.AddressDecoder,
        label='address without sub',
    )

    # Confirm cache reset
    pattern = r'Multiple matching entries .* encoder registry'
    with pytest.raises(ValueError, match=pattern):
        registry.get_encoder('address')

    pattern = r'Multiple matching entries .* decoder registry'
    with pytest.raises(ValueError, match=pattern):
        registry.get_decoder('address')
예제 #11
0
def test_can_unregister_by_equality(registry: ABIRegistry):
    registry.unregister(BaseEquals('address'))

    with pytest.raises(exceptions.NoEntriesFound):
        registry.get_encoder('address')
    with pytest.raises(exceptions.NoEntriesFound):
        registry.get_decoder('address')
예제 #12
0
def test_can_unregister_by_equality(registry: ABIRegistry):
    registry.unregister(BaseEquals('address'))

    with pytest.raises(ValueError,
                       match=r'No matching entries .* encoder registry'):
        registry.get_encoder('address')
    with pytest.raises(ValueError,
                       match=r'No matching entries .* decoder registry'):
        registry.get_decoder('address')
예제 #13
0
def test_copying_copies_internal_mappings(registry: ABIRegistry):
    c1 = registry.copy()
    c2 = copy.copy(registry)
    c3 = copy.deepcopy(registry)

    for x, y in itertools.combinations((registry, c1, c2, c3), 2):
        # Objects are different
        assert id(x) != id(y)

        # Internal mapping objects are different
        assert id(x._encoders) != id(y._encoders)
        assert id(x._decoders) != id(y._decoders)

        # Coders can be found for existing registrations
        assert isinstance(x.get_encoder('address'), encoding.AddressEncoder)
        assert isinstance(x.get_decoder('address'), decoding.AddressDecoder)
        assert isinstance(y.get_encoder('address'), encoding.AddressEncoder)
        assert isinstance(y.get_decoder('address'), decoding.AddressDecoder)
예제 #14
0
def registry():
    reg = ABIRegistry()

    reg.register(
        has_arrlist,
        encoding.BaseArrayEncoder,
        decoding.BaseArrayDecoder,
        label='has_arrlist',
    )
    reg.register(
        BaseEquals('address'),
        encoding.AddressEncoder,
        decoding.AddressDecoder,
        label='address',
    )

    return reg
예제 #15
0
def test_has_encoder_returns_false(registry: ABIRegistry):
    assert not registry.has_encoder('foo')
예제 #16
0
def test_has_encoder_returns_true(registry: ABIRegistry):
    assert registry.has_encoder('address')
예제 #17
0
def test_looking_up_unparsable_type_causes_error(registry: ABIRegistry):
    with pytest.raises(exceptions.ParseError, match='Parse error at'):
        registry.get_encoder('uint[]256')
예제 #18
0
def test_registry_should_reject_unknown_types(registry: ABIRegistry):
    with pytest.raises(TypeError):
        registry.register(True, None, None)
    with pytest.raises(TypeError):
        registry.unregister(True)