def test_set_with_prefix_validators():
    mv = MetadataValidatorSet([
        # this is vile
        MetadataValidator('pre1',
                          prefix_validators=[
                              lambda p, k, v: exec('assert p == "pre1"'),
                              lambda p, k, v: exec('assert k == "pre1stuff"'),
                              lambda p, k, v: exec('assert v == {"a": "b"}')
                          ]),
        MetadataValidator(
            'pre2',
            prefix_validators=[lambda p, k, v: exec('assert p == "pre2"')])
    ])

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

    assert mv.keys() == []
    assert mv.prefix_keys() == ['pre1', 'pre2']
    assert mv.prefix_validator_count('pre1') == 3
    assert mv.prefix_validator_count('pre2') == 1
def test_set_with_prefix_validators_and_standard_validator():
    mv = MetadataValidatorSet([
        # this is vile
        MetadataValidator('pre1',
                          prefix_validators=[
                              lambda p, k, v: exec('assert p == "pre1"'),
                              lambda p, k, v: exec('assert k == "pre1stuff"'),
                              lambda p, k, v: exec('assert v == {"a": "b"}')
                          ]),
        MetadataValidator(
            'pre2',
            prefix_validators=[lambda p, k, v: exec('assert p == "pre2"')]),
        # test that non-prefix validator with same name is ok
        MetadataValidator('pre2', [lambda k, v: exec('raise ValueError()')])
    ])

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

    assert mv.keys() == ['pre2']
    assert mv.prefix_keys() == ['pre1', 'pre2']
    assert mv.prefix_validator_count('pre1') == 3
    assert mv.prefix_validator_count('pre2') == 1
def _prefix_validator_count_fail(vals, prefix, expected):
    mv = MetadataValidatorSet(vals)
    with raises(Exception) as got:
        mv.prefix_validator_count(prefix)
    assert_exception_correct(got.value, expected)