File: test_omdict1D.py

package info (click to toggle)
python-furl 2.1.4-0.1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 444 kB
  • sloc: python: 2,974; makefile: 3
file content (175 lines) | stat: -rw-r--r-- 6,296 bytes parent folder | download | duplicates (4)
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
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
# -*- coding: utf-8 -*-

#
# furl - URL manipulation made simple.
#
# Ansgar Grunseid
# grunseid.com
# grunseid@gmail.com
#
# License: Build Amazing Things (Unlicense)
#

import unittest
from itertools import chain, product, permutations

import six
from furl.omdict1D import omdict1D
from orderedmultidict import omdict

_unique = object()


class TestOmdict1D(unittest.TestCase):

    def setUp(self):
        self.key = 'sup'
        self.keys = [1, 2, -1, 'a', None, 0.9]
        self.values = [1, 2, None]
        self.valuelists = [[], [1], [1, 2, 3], [None, None, 1]]

    def test_update_updateall(self):
        data, omd1, omd2 = omdict(), omdict1D(), omdict1D()

        # All permutations of (self.keys, self.values) and (self.keys,
        # self.valuelists).
        allitems = chain(product(self.keys, self.values),
                         product(self.keys, self.valuelists))

        # All updates of length one item, two items, and three items.
        iterators = [permutations(allitems, 1),
                     permutations(allitems, 2),
                     permutations(allitems, 3),
                     permutations(allitems, 4),
                     ]

        for iterator in iterators:
            for update in iterator:
                data.update(update)
                omd1.update(update)
                omd2.updateall(update)
                for key in six.iterkeys(omd1):
                    if isinstance(data[key], list):
                        assert omd1[key] == data[key][-1]
                    else:
                        assert omd1[key] == data[key]
                for key in six.iterkeys(omd2):
                    data_values_unpacked = []
                    for value in data.getlist(key):
                        if isinstance(value, list):
                            data_values_unpacked.extend(value)
                        else:
                            data_values_unpacked.append(value)

                    assert omd2.getlist(key) == data_values_unpacked

        # Test different empty list value locations.
        update_tests = [([(1, None), (2, None)],
                         [(1, [1, 11]), (2, [2, 22])],
                         [(1, 11), (2, 22)]),
                        ([(1, None), (2, None)],
                         [(1, []), (1, 1), (1, 11)],
                         [(1, 11), (2, None)]),
                        ([(1, None), (2, None)],
                         [(1, 1), (1, []), (1, 11)],
                         [(1, 11), (2, None)]),
                        ([(1, None), (2, None)],
                         [(1, 1), (1, 11), (1, [])],
                         [(2, None)]),
                        ]
        for init, update, result in update_tests:
            omd = omdict1D(init)
            omd.update(update)
            assert omd.allitems() == result

        updateall_tests = [([(1, None), (2, None)],
                            [(1, [1, 11]), (2, [2, 22])],
                            [(1, 1), (2, 2), (1, 11), (2, 22)]),
                           ([(1, None), (2, None)],
                            [(1, []), (1, 1), (1, 11)],
                            [(1, 1), (2, None), (1, 11)]),
                           ([(1, None), (2, None)],
                            [(1, 1), (1, []), (1, 11)],
                            [(1, 11), (2, None)]),
                           ([(1, None), (2, None)],
                            [(1, 1), (1, 11), (1, [])],
                            [(2, None)]),
                           ]
        for init, update, result in updateall_tests:
            omd = omdict1D(init)
            omd.updateall(update)
            assert omd.allitems() == result

    def test_add(self):
        runningsum = []
        omd = omdict1D()
        for valuelist in self.valuelists:
            runningsum += valuelist
            if valuelist:
                assert omd.add(self.key, valuelist) == omd
                assert omd[self.key] == omd.get(self.key) == runningsum[0]
                assert omd.getlist(self.key) == runningsum
            else:
                assert self.key not in omd

        runningsum = []
        omd = omdict1D()
        for value in self.values:
            runningsum += [value]
            assert omd.add(self.key, value) == omd
            assert omd[self.key] == omd.get(self.key) == runningsum[0]
            assert omd.getlist(self.key) == runningsum

        # Empty list of values adds nothing.
        assert _unique not in omd
        assert omd.add(_unique, []) == omd
        assert _unique not in omd

    def test_set(self):
        omd1, omd2, omd3 = omdict1D(), omdict1D(), omdict1D()

        for valuelist in self.valuelists:
            omd1[self.key] = valuelist
            assert omd2.set(self.key, valuelist) == omd2
            assert omd3.setlist(self.key, valuelist) == omd3
            assert omd1 == omd2 == omd3 and omd1.getlist(self.key) == valuelist

        # Empty list of values deletes that key and all its values,
        # equivalent to del omd[somekey].
        omd = omdict1D()
        assert _unique not in omd
        omd.set(_unique, [])
        assert omd == omd
        assert _unique not in omd

        omd.set(_unique, [1, 2, 3])
        assert omd.getlist(_unique) == [1, 2, 3]
        omd.set(_unique, [])
        assert _unique not in omd

    def test_setitem(self):
        omd = omdict1D()
        for value, valuelist in six.moves.zip(self.values, self.valuelists):
            if valuelist:
                omd[self.key] = valuelist
                assert omd[self.key] == omd.get(self.key) == valuelist[0]
                assert omd.getlist(self.key) == valuelist
            else:
                assert self.key not in omd

            omd[self.key] = value
            assert omd[self.key] == omd.get(self.key) == value
            assert omd.getlist(self.key) == [value]

        # Empty list of values deletes that key and all its values,
        # equivalent to del omd[somekey].
        omd = omdict1D()
        assert _unique not in omd
        omd[_unique] = []
        assert omd == omd
        assert _unique not in omd

        omd[_unique] = [1, 2, 3]
        assert omd.getlist(_unique) == [1, 2, 3]
        omd[_unique] = []
        assert _unique not in omd