def test_set_with_validators():
    mv = MetadataValidatorSet([
        # this is vile
        MetadataValidator('key1', [
            lambda k, v: exec('assert k == "key1"'),
            lambda k, v: exec('assert v == {"a": "b"}')
        ]),
        MetadataValidator('key2', [lambda k, v: exec('assert k == "key2"')])
    ])

    md = {'key1': {'a': 'b'}, 'key2': {'foo': 'bar'}}
    mv.validate_metadata(md)
    mv.validate_metadata(maps.FrozenMap(md))

    assert mv.keys() == ['key1', 'key2']
    assert mv.prefix_keys() == []
    assert mv.validator_count('key1') == 2
    assert mv.validator_count('key2') == 1
def _validator_count_fail(vals, key, expected):
    mv = MetadataValidatorSet(vals)
    with raises(Exception) as got:
        mv.validator_count(key)
    assert_exception_correct(got.value, expected)