-
Notifications
You must be signed in to change notification settings - Fork 29
/
Copy pathtest_dict_utils.py
70 lines (51 loc) · 2.1 KB
/
test_dict_utils.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
import unittest
import yaml
from linkml_runtime.linkml_model.meta import ClassDefinition, SlotDefinition, ElementName
import linkml_runtime.utils.yamlutils as yutils
from linkml_runtime.utils.dictutils import as_simple_dict
from tests.support.test_environment import TestEnvironmentTestCase
from tests.test_utils.environment import env
def _signature(d):
if isinstance(d, dict):
for x in d.values():
yield x
elif isinstance(d, list):
for x in d:
yield x
else:
yield d
def _is_python_type(obj):
t = type(obj)
return t in [dict, list, str, int, float, type(None)] or isinstance(obj, ElementName)
def _is_basic_type(obj):
return _is_python_type(obj) or isinstance(obj, ElementName)
class DictUtilTestCase(TestEnvironmentTestCase):
env = env
def test_as_dict(self):
obj = ClassDefinition('test class')
obj2 = ClassDefinition('test class', slot_usage={'foo': SlotDefinition(name='foo', range='bar')})
#obj2.slot_usage = {'foo': SlotDefinition(name='foo', range='bar')}
# as dict preserves nones and empty lists
d = yutils.as_dict(obj)
assert isinstance(d, dict)
assert d['name'] == 'test class'
assert d['id_prefixes'] == []
assert d['description'] is None
assert all(_is_basic_type(x) for x in _signature(d))
d2 = yutils.as_dict(obj2)
assert d2['slot_usage']['foo']['range'] == 'bar'
assert all(_is_basic_type(x) for x in _signature(d2))
# as_simple_dict removes nones and empty lists
d = as_simple_dict(obj)
assert isinstance(d, dict)
assert all(_is_python_type(x) for x in _signature(d))
assert d == {'name': 'test class'}
d2 = as_simple_dict(obj2)
assert isinstance(d2, dict)
assert d2 == {'name': 'test class', 'slot_usage': {'foo': {'name': 'foo', 'range': 'bar'}}}
s = yutils.as_yaml(obj)
assert(s.strip() == 'name: test class')
s2 = yutils.as_yaml(obj2)
assert(s2.strip().startswith('name: test class'))
if __name__ == '__main__':
unittest.main()