File: test_dict.py

package info (click to toggle)
ubelt 1.4.0-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 2,180 kB
  • sloc: python: 15,487; sh: 807; makefile: 24
file content (138 lines) | stat: -rw-r--r-- 4,256 bytes parent folder | download | duplicates (2)
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
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
import ubelt as ub
import pytest


def test_auto_dict():
    auto = ub.AutoDict()
    assert 0 not in auto
    auto[0][10][100] = None
    assert 0 in auto
    assert isinstance(auto[0], ub.AutoDict)


def test_auto_dict_to_dict():
    from ubelt.util_dict import AutoDict
    auto = AutoDict()
    auto[1] = 1
    auto['n1'] = AutoDict()
    auto['n1']['n2'] = AutoDict()
    auto['n1']['n2'][2] = 2
    auto['n1']['n2'][3] = 3
    auto['dict'] = {}
    auto['dict']['n3'] = AutoDict()
    auto['dict']['n3']['n4'] = AutoDict()
    print('auto = {!r}'.format(auto))
    static = auto.to_dict()
    print('static = {!r}'.format(static))
    assert not isinstance(static, AutoDict), '{}'.format(type(static))
    assert not isinstance(static['n1'], AutoDict), '{}'.format(type(static['n1']))
    assert not isinstance(static['n1']['n2'], AutoDict)
    assert isinstance(static['dict']['n3'], AutoDict)
    assert isinstance(static['dict']['n3']['n4'], AutoDict)


def test_auto_dict_ordered():
    # To Dict should respect ordering
    from ubelt.util_dict import AutoOrderedDict, AutoDict
    auto = AutoOrderedDict()
    auto[0][3] = 3
    auto[0][2] = 2
    auto[0][1] = 1
    auto[0][4] = AutoDict()
    assert isinstance(auto, AutoDict)
    print('auto = {!r}'.format(auto))
    static = auto.to_dict()
    print('static = {!r}'.format(static))
    assert not isinstance(static, AutoDict), 'bad cast {}'.format(type(static))
    assert not isinstance(static[0][4], AutoDict), 'bad cast {}'.format(type(static[0][4]))
    assert list(auto[0].values())[0:3] == [3, 2, 1], 'maintain order'


def test_dzip_errors():
    with pytest.raises(TypeError):
        ub.dzip([1], 2)
    with pytest.raises(TypeError):
        ub.dzip(1, [2])
    with pytest.raises(ValueError):
        ub.dzip([1, 2, 3], [])
    with pytest.raises(ValueError):
        ub.dzip([], [4, 5, 6])
    with pytest.raises(ValueError):
        ub.dzip([1, 2, 3], [4, 5])


def test_group_items_callable():
    pairs = [
        ('ham', 'protein'),
        ('jam', 'fruit'),
        ('spam', 'protein'),
        ('eggs', 'protein'),
        ('cheese', 'dairy'),
        ('banana', 'fruit'),
    ]
    items, groupids = zip(*pairs)
    lut = dict(zip(items, groupids))

    result1 = ub.group_items(items, groupids)
    result2 = ub.group_items(items, lut.__getitem__)

    result1 = ub.map_values(set, result1)
    result2 = ub.map_values(set, result2)
    assert result1 == result2


def test_dict_hist_ordered():
    import random
    import string
    import ubelt as ub
    rng = random.Random(0)
    items = [rng.choice(string.ascii_letters) for _ in range(100)]
    # Ensure that the ordered=True bug is fixed
    a = sorted(ub.dict_hist(items, ordered=True).items())
    b = sorted(ub.dict_hist(items, ordered=False).items())
    assert a == b


def test_dict_subset_iterable():
    """
    CommandLine:
        xdoctest -m ~/code/ubelt/tests/test_dict.py test_dict_subset_iterable
    """
    # There was a bug in 0.7.0 where iterable keys would be exhausted too soon
    keys_list = list(range(10))
    dict_ = {k: k for k in keys_list}
    got = ub.dict_subset(dict_, iter(keys_list))
    assert dict(got) == dict_


# def _benchmark_groupid_sorted():
#     import random
#     import ubelt as ub

#     ydata = ub.ddict(list)
#     xdata = []

#     ti = ub.Timerit(100, bestof=10, verbose=True)

#     num = 10
#     for gamma in [0.01, .1, .5]:
#         for num in [10, 100, 1000, 10000, 100000]:
#             items = [random.random() for _ in range(num)]
#             groupids = [random.randint(0, int(num ** gamma)) for _ in range(num)]

#             xdata.append(num)

#             for timer in ti.reset(label='sort_g{}'.format(gamma)):
#                 with timer:
#                     ub.group_items(items, groupids, sorted_=True)
#             ydata[ti.label].append(ti.min())

#             for timer in ti.reset(label='nosort_g{}'.format(gamma)):
#                 with timer:
#                     ub.group_items(items, groupids, sorted_=False)
#             ydata[ti.label].append(ti.min())

#     ydata = ub.odict(sorted(ydata.items(), key=lambda t: t[1][-1])[::-1])
#     import netharn as nh
#     nh.util.autompl()
#     nh.util.multi_plot(xdata, ydata)