File: test_union_dict.py

package info (click to toggle)
python-cogent 2024.5.7a1%2Bdfsg-3
  • links: PTS, VCS
  • area: main
  • in suites: sid
  • size: 74,600 kB
  • sloc: python: 92,479; makefile: 117; sh: 16
file content (115 lines) | stat: -rw-r--r-- 4,092 bytes parent folder | download
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
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
#!/usr/bin/env python

"""Unit tests for union_dict.
"""
from unittest import TestCase

from cogent3.util.union_dict import UnionDict


class UnionDictTests(TestCase):
    """Tests of individual functions in union_dict"""

    def test_attr(self):
        """test the "." read/write functionality"""
        d = UnionDict({"a": 1, "b": 2, "c": 3, "d": {"e": 5, "f": 6}})
        self.assertEqual(d.a, 1)
        self.assertEqual(d.b, 2)
        self.assertEqual(d.d.e, 5)
        d.c = 0
        d.d.f = 0
        self.assertEqual(d.c, 0)
        self.assertEqual(d.d.f, 0)

    def test_construction(self):
        """should handle deeply nested dict"""
        data = {"width": 600.0, "xaxis": {"title": {"text": "Alignment Position"}}}
        d = UnionDict(data)
        self.assertEqual(d.xaxis.title.text, "Alignment Position")

    def test_construct_from_empty(self):
        """successfully define from an empty"""
        data = {"width": 600.0, "xaxis": {"title": {"text": "Alignment Position"}}}
        # empty object
        d = UnionDict()
        self.assertTrue(len(d) == 0)
        # using update
        d.update(data)
        self.assertEqual(d.xaxis.title.text, "Alignment Position")

    def test_construct_from_kwargs(self):
        """successfully define from an kwargs"""
        data = {"width": 600.0, "xaxis": {"title": {"text": "Alignment Position"}}}
        # empty object
        d = UnionDict(**data)
        self.assertEqual(d.xaxis.title.text, "Alignment Position")

    def test_union(self):
        """correctly adjust a prob vector so all values > minval"""
        d = UnionDict({"a": 1, "b": 2, "c": 3, "d": {"e": 5, "f": 6}})
        e = UnionDict({"b": 0, "d": {"f": 0, "g": 7}})
        d |= e
        self.assertEqual(d.a, 1)
        self.assertEqual(d.b, 0)
        self.assertEqual(d.d.e, 5)
        self.assertEqual(d.d.f, 0)
        self.assertEqual(d.d.g, 7)

    def test_or(self):
        """should not modify original"""
        d = UnionDict({"a": 1, "b": 2, "c": 3, "d": {"e": 5, "f": 6}})
        e = UnionDict({"b": 0, "d": {"f": 0, "g": 7}})
        f = d | e
        self.assertEqual(f.a, 1)
        self.assertEqual(f.b, 0)
        self.assertEqual(f.d.e, 5)
        self.assertEqual(f.d.f, 0)
        self.assertEqual(f.d.g, 7)
        self.assertTrue(f.d is not e.d)

    def test_union_value_dict(self):
        """replacing union or of a value with a dict should be dict"""
        d = UnionDict({"A": {"B": "Blah"}})
        e = UnionDict({"A": "Blah"})
        f = UnionDict(d.copy())
        f |= e
        self.assertNotEqual(d, f)
        e |= d
        self.assertEqual(d, e)

    def test_union_with_empty_sub_dict(self):
        """unioning with a dict that has an empty sub-dict"""
        d = UnionDict({"title": {}})
        e = UnionDict({"title": {"text": "Alignment Position"}})
        f = UnionDict(e.copy())
        e |= d
        self.assertEqual(e, f)

    def test_sub_dicts_are_union(self):
        """checks if UnionDict is propogated to children"""
        d = UnionDict({"a": 1, "b": 2, "c": 3, "d": {"e": 5, "f": 6}})
        d.e = {"g": 7}
        d.e.g = {"h": 8}
        self.assertTrue(isinstance(d, UnionDict))
        self.assertTrue(isinstance(d.d, UnionDict))
        self.assertTrue(isinstance(d.e, UnionDict))
        self.assertTrue(isinstance(d.e.g, UnionDict))

    def test_get_subattr(self):
        """_getsubattr_ returns nested values via key"""
        d = UnionDict({"a": 1, "b": 2, "c": 3, "d": {"e": 5, "f": 6}})
        self.assertEqual(d._getsubattr_([], "a"), 1)
        self.assertEqual(d._getsubattr_([], "d"), UnionDict({"e": 5, "f": 6}))
        self.assertEqual(d._getsubattr_(["d"], "e"), 5)

    def test_setitem(self):
        """should work via property or key"""
        d = UnionDict()
        d.a = 23
        d.b = dict(c=42)
        self.assertEqual(d.a, 23)
        self.assertEqual(d["a"], 23)
        self.assertEqual(d.b, dict(c=42))
        self.assertEqual(d.b.c, 42)
        self.assertEqual(d["b"], dict(c=42))
        self.assertIsInstance(d.b, UnionDict)