1 """Unit tests for collections.defaultdict."""
7 from test
import test_support
9 from collections
import defaultdict
14 class TestDefaultDict(unittest
.TestCase
):
18 self
.assertEqual(d1
.default_factory
, None)
19 d1
.default_factory
= list
21 self
.assertEqual(d1
, {12: [42]})
23 self
.assertEqual(d1
, {12: [42, 24]})
26 self
.assertEqual(d1
, {12: [42, 24], 13: [], 14: []})
27 self
.assert_(d1
[12] is not d1
[13] is not d1
[14])
28 d2
= defaultdict(list, foo
=1, bar
=2)
29 self
.assertEqual(d2
.default_factory
, list)
30 self
.assertEqual(d2
, {"foo": 1, "bar": 2})
31 self
.assertEqual(d2
["foo"], 1)
32 self
.assertEqual(d2
["bar"], 2)
33 self
.assertEqual(d2
[42], [])
34 self
.assert_("foo" in d2
)
35 self
.assert_("foo" in d2
.keys())
36 self
.assert_("bar" in d2
)
37 self
.assert_("bar" in d2
.keys())
38 self
.assert_(42 in d2
)
39 self
.assert_(42 in d2
.keys())
40 self
.assert_(12 not in d2
)
41 self
.assert_(12 not in d2
.keys())
42 d2
.default_factory
= None
43 self
.assertEqual(d2
.default_factory
, None)
47 self
.assertEqual(err
.args
, (15,))
49 self
.fail("d2[15] didn't raise KeyError")
50 self
.assertRaises(TypeError, defaultdict
, 1)
52 def test_missing(self
):
54 self
.assertRaises(KeyError, d1
.__missing__
, 42)
55 d1
.default_factory
= list
56 self
.assertEqual(d1
.__missing__(42), [])
60 self
.assertEqual(d1
.default_factory
, None)
61 self
.assertEqual(repr(d1
), "defaultdict(None, {})")
63 self
.assertEqual(repr(d1
), "defaultdict(None, {11: 41})")
65 self
.assertEqual(d2
.default_factory
, int)
67 self
.assertEqual(repr(d2
), "defaultdict(<type 'int'>, {12: 42})")
70 self
.assert_(d3
.default_factory
is foo
)
72 self
.assertEqual(repr(d3
), "defaultdict(%s, {13: 43})" % repr(foo
))
77 d2
= defaultdict(foo
, {1: 2})
78 # NOTE: We can't use tempfile.[Named]TemporaryFile since this
79 # code must exercise the tp_print C code, which only gets
80 # invoked for *real* files.
81 tfn
= tempfile
.mktemp()
88 self
.assertEqual(f
.readline(), repr(d1
) + "\n")
89 self
.assertEqual(f
.readline(), repr(d2
) + "\n")
98 self
.assertEqual(type(d2
), defaultdict
)
99 self
.assertEqual(d2
.default_factory
, None)
100 self
.assertEqual(d2
, {})
101 d1
.default_factory
= list
103 self
.assertEqual(type(d3
), defaultdict
)
104 self
.assertEqual(d3
.default_factory
, list)
105 self
.assertEqual(d3
, {})
108 self
.assertEqual(type(d4
), defaultdict
)
109 self
.assertEqual(d4
.default_factory
, list)
110 self
.assertEqual(d4
, {42: []})
112 self
.assertEqual(d4
, {42: [], 12: []})
114 def test_shallow_copy(self
):
115 d1
= defaultdict(foobar
, {1: 1})
117 self
.assertEqual(d2
.default_factory
, foobar
)
118 self
.assertEqual(d2
, d1
)
119 d1
.default_factory
= list
121 self
.assertEqual(d2
.default_factory
, list)
122 self
.assertEqual(d2
, d1
)
124 def test_deep_copy(self
):
125 d1
= defaultdict(foobar
, {1: [1]})
126 d2
= copy
.deepcopy(d1
)
127 self
.assertEqual(d2
.default_factory
, foobar
)
128 self
.assertEqual(d2
, d1
)
129 self
.assert_(d1
[1] is not d2
[1])
130 d1
.default_factory
= list
131 d2
= copy
.deepcopy(d1
)
132 self
.assertEqual(d2
.default_factory
, list)
133 self
.assertEqual(d2
, d1
)
135 def test_keyerror_without_factory(self
):
139 except KeyError, err
:
140 self
.assertEqual(err
.args
[0], (1,))
142 self
.fail("expected KeyError")
144 def test_recursive_repr(self
):
145 # Issue2045: stack overflow when default_factory is a bound method
146 class sub(defaultdict
):
148 self
.default_factory
= self
._factory
152 self
.assert_(repr(d
).startswith(
153 "defaultdict(<bound method sub._factory of defaultdict(..."))
155 # NOTE: printing a subclass of a builtin type does not call its
156 # tp_print slot. So this part is essentially the same test as above.
157 tfn
= tempfile
.mktemp()
169 test_support
.run_unittest(TestDefaultDict
)
171 if __name__
== "__main__":