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 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 test_empty_set():
    mv = MetadataValidatorSet()

    assert mv.keys() == []
    assert mv.prefix_keys() == []