1 # Check every path through every method of UserDict
3 from test
import test_support
, mapping_tests
8 d2
= {"one": 1, "two": 2}
9 d3
= {"one": 1, "two": 3, "three": 5}
10 d4
= {"one": None, "two": None}
11 d5
= {"one": 1, "two": 1}
13 class UserDictTest(mapping_tests
.TestHashMappingProtocol
):
14 type2test
= UserDict
.IterableUserDict
18 u
= UserDict
.UserDict()
19 u0
= UserDict
.UserDict(d0
)
20 u1
= UserDict
.UserDict(d1
)
21 u2
= UserDict
.IterableUserDict(d2
)
23 uu
= UserDict
.UserDict(u
)
24 uu0
= UserDict
.UserDict(u0
)
25 uu1
= UserDict
.UserDict(u1
)
26 uu2
= UserDict
.UserDict(u2
)
28 # keyword arg constructor
29 self
.assertEqual(UserDict
.UserDict(one
=1, two
=2), d2
)
30 # item sequence constructor
31 self
.assertEqual(UserDict
.UserDict([('one',1), ('two',2)]), d2
)
32 self
.assertEqual(UserDict
.UserDict(dict=[('one',1), ('two',2)]), d2
)
34 self
.assertEqual(UserDict
.UserDict([('one',1), ('two',2)], two
=3, three
=5), d3
)
36 # alternate constructor
37 self
.assertEqual(UserDict
.UserDict
.fromkeys('one two'.split()), d4
)
38 self
.assertEqual(UserDict
.UserDict().fromkeys('one two'.split()), d4
)
39 self
.assertEqual(UserDict
.UserDict
.fromkeys('one two'.split(), 1), d5
)
40 self
.assertEqual(UserDict
.UserDict().fromkeys('one two'.split(), 1), d5
)
41 self
.assert_(u1
.fromkeys('one two'.split()) is not u1
)
42 self
.assert_(isinstance(u1
.fromkeys('one two'.split()), UserDict
.UserDict
))
43 self
.assert_(isinstance(u2
.fromkeys('one two'.split()), UserDict
.IterableUserDict
))
46 self
.assertEqual(str(u0
), str(d0
))
47 self
.assertEqual(repr(u1
), repr(d1
))
48 self
.assertEqual(`u2`
, `d2`
)
50 # Test __cmp__ and __len__
51 all
= [d0
, d1
, d2
, u
, u0
, u1
, u2
, uu
, uu0
, uu1
, uu2
]
54 self
.assertEqual(cmp(a
, b
), cmp(len(a
), len(b
)))
57 self
.assertEqual(u2
["one"], 1)
58 self
.assertRaises(KeyError, u1
.__getitem__
, "two")
61 u3
= UserDict
.UserDict(u2
)
67 self
.assertRaises(KeyError, u3
.__delitem__
, "three")
71 self
.assertEqual(u3
, {})
75 self
.assertEqual(u2a
, u2
)
76 u2b
= UserDict
.UserDict(x
=42, y
=23)
77 u2c
= u2b
.copy() # making a copy of a UserDict is special cased
78 self
.assertEqual(u2b
, u2c
)
80 class MyUserDict(UserDict
.UserDict
):
81 def display(self
): print self
85 self
.assertEqual(m2a
, m2
)
87 # SF bug #476616 -- copy() of UserDict subclass shared data
89 self
.assertNotEqual(m2a
, m2
)
91 # Test keys, items, values
92 self
.assertEqual(u2
.keys(), d2
.keys())
93 self
.assertEqual(u2
.items(), d2
.items())
94 self
.assertEqual(u2
.values(), d2
.values())
96 # Test has_key and "in".
98 self
.assert_(u2
.has_key(i
))
100 self
.assertEqual(u1
.has_key(i
), d1
.has_key(i
))
101 self
.assertEqual(i
in u1
, i
in d1
)
102 self
.assertEqual(u0
.has_key(i
), d0
.has_key(i
))
103 self
.assertEqual(i
in u0
, i
in d0
)
106 t
= UserDict
.UserDict()
108 self
.assertEqual(t
, u2
)
111 return (("x", 42), ("y", 23))
112 t
= UserDict
.UserDict()
114 self
.assertEqual(t
, {"x": 42, "y": 23})
118 self
.assertEqual(u2
.get(i
), u2
[i
])
119 self
.assertEqual(u1
.get(i
), d1
.get(i
))
120 self
.assertEqual(u0
.get(i
), d0
.get(i
))
122 # Test "in" iteration.
129 self
.assertEqual(set(ikeys
), set(keys
))
132 t
= UserDict
.UserDict()
133 self
.assertEqual(t
.setdefault("x", 42), 42)
134 self
.assert_(t
.has_key("x"))
135 self
.assertEqual(t
.setdefault("x", 23), 42)
138 t
= UserDict
.UserDict(x
=42)
139 self
.assertEqual(t
.pop("x"), 42)
140 self
.assertRaises(KeyError, t
.pop
, "x")
141 self
.assertEqual(t
.pop("x", 1), 1)
143 self
.assertEqual(t
.pop("x", 1), 42)
146 t
= UserDict
.UserDict(x
=42)
147 self
.assertEqual(t
.popitem(), ("x", 42))
148 self
.assertRaises(KeyError, t
.popitem
)
150 def test_missing(self
):
151 # Make sure UserDict doesn't have a __missing__ method
152 self
.assertEqual(hasattr(UserDict
, "__missing__"), False)
153 # Test several cases:
154 # (D) subclass defines __missing__ method returning a value
155 # (E) subclass defines __missing__ method raising RuntimeError
156 # (F) subclass sets __missing__ instance variable (no effect)
157 # (G) subclass doesn't define __missing__ at a all
158 class D(UserDict
.UserDict
):
159 def __missing__(self
, key
):
162 self
.assertEqual(d
[1], 2)
163 self
.assertEqual(d
[3], 4)
164 self
.assert_(2 not in d
)
165 self
.assert_(2 not in d
.keys())
166 self
.assertEqual(d
[2], 42)
167 class E(UserDict
.UserDict
):
168 def __missing__(self
, key
):
169 raise RuntimeError(key
)
173 except RuntimeError, err
:
174 self
.assertEqual(err
.args
, (42,))
176 self
.fail("e[42] didn't raise RuntimeError")
177 class F(UserDict
.UserDict
):
179 # An instance variable __missing__ should have no effect
180 self
.__missing
__ = lambda key
: None
181 UserDict
.UserDict
.__init
__(self
)
185 except KeyError, err
:
186 self
.assertEqual(err
.args
, (42,))
188 self
.fail("f[42] didn't raise KeyError")
189 class G(UserDict
.UserDict
):
194 except KeyError, err
:
195 self
.assertEqual(err
.args
, (42,))
197 self
.fail("g[42] didn't raise KeyError")
199 ##########################
202 class SeqDict(UserDict
.DictMixin
):
203 """Dictionary lookalike implemented with lists.
205 Used to test and demonstrate DictMixin
207 def __init__(self
, other
=None, **kwargs
):
210 if other
is not None:
211 for (key
, value
) in other
:
213 for (key
, value
) in kwargs
.iteritems():
215 def __getitem__(self
, key
):
217 i
= self
.keylist
.index(key
)
220 return self
.valuelist
[i
]
221 def __setitem__(self
, key
, value
):
223 i
= self
.keylist
.index(key
)
224 self
.valuelist
[i
] = value
226 self
.keylist
.append(key
)
227 self
.valuelist
.append(value
)
228 def __delitem__(self
, key
):
230 i
= self
.keylist
.index(key
)
234 self
.valuelist
.pop(i
)
236 return list(self
.keylist
)
239 for key
, value
in self
.iteritems():
243 def fromkeys(cls
, keys
, value
=None):
249 class UserDictMixinTest(mapping_tests
.TestMappingProtocol
):
253 ## Setup test and verify working of the test class
265 # check getitem and setitem
266 self
.assertEqual(s
[10], 'ten')
267 # check keys() and delitem
268 self
.assertEqual(s
.keys(), [10, 30])
270 ## Now, test the DictMixin methods one by one
272 self
.assert_(s
.has_key(10))
273 self
.assert_(not s
.has_key(20))
276 self
.assert_(10 in s
)
277 self
.assert_(20 not in s
)
280 self
.assertEqual([k
for k
in s
], [10, 30])
283 self
.assertEqual(len(s
), 2)
286 self
.assertEqual(list(s
.iteritems()), [(10,'ten'), (30, 'thirty')])
289 self
.assertEqual(list(s
.iterkeys()), [10, 30])
292 self
.assertEqual(list(s
.itervalues()), ['ten', 'thirty'])
295 self
.assertEqual(s
.values(), ['ten', 'thirty'])
298 self
.assertEqual(s
.items(), [(10,'ten'), (30, 'thirty')])
301 self
.assertEqual(s
.get(10), 'ten')
302 self
.assertEqual(s
.get(15,'fifteen'), 'fifteen')
303 self
.assertEqual(s
.get(15), None)
306 self
.assertEqual(s
.setdefault(40, 'forty'), 'forty')
307 self
.assertEqual(s
.setdefault(10, 'null'), 'ten')
311 self
.assertEqual(s
.pop(10), 'ten')
312 self
.assert_(10 not in s
)
314 self
.assertEqual(s
.pop("x", 1), 1)
316 self
.assertEqual(s
.pop("x", 1), 42)
320 self
.assert_(k
not in s
)
325 self
.assertEqual(len(s
), 0)
328 self
.assertRaises(KeyError, s
.popitem
)
331 s
.update({10: 'ten', 20:'twenty'})
332 self
.assertEqual(s
[10], 'ten')
333 self
.assertEqual(s
[20], 'twenty')
336 self
.assertEqual(s
, {10: 'ten', 20:'twenty'})
340 self
.assertEqual(s
, t
)
343 test_support
.run_unittest(
348 if __name__
== "__main__":