blob: ade5da21121cff9803f690708bd10c43fa9d2bbe [file] [log] [blame]
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001"""Unit tests for collections.py."""
2
Guido van Rossumd8faa362007-04-27 19:54:29 +00003import unittest
4from test import test_support
5from collections import NamedTuple
Guido van Rossumcd16bf62007-06-13 18:07:49 +00006from collections import Hashable, Iterable, Iterator
7from collections import Sized, Container, Callable
8from collections import Set, MutableSet
9from collections import Mapping, MutableMapping
10from collections import Sequence, MutableSequence
11
Guido van Rossumd8faa362007-04-27 19:54:29 +000012
13class TestNamedTuple(unittest.TestCase):
14
15 def test_factory(self):
16 Point = NamedTuple('Point', 'x y')
17 self.assertEqual(Point.__name__, 'Point')
18 self.assertEqual(Point.__doc__, 'Point(x, y)')
19 self.assertEqual(Point.__slots__, ())
20 self.assertEqual(Point.__module__, __name__)
21 self.assertEqual(Point.__getitem__, tuple.__getitem__)
Guido van Rossumd59da4b2007-05-22 18:11:13 +000022 self.assertRaises(ValueError, NamedTuple, 'abc%', 'def ghi')
23 self.assertRaises(ValueError, NamedTuple, 'abc', 'def g%hi')
24 NamedTuple('Point0', 'x1 y2') # Verify that numbers are allowed in names
Guido van Rossumd8faa362007-04-27 19:54:29 +000025
26 def test_instance(self):
27 Point = NamedTuple('Point', 'x y')
28 p = Point(11, 22)
29 self.assertEqual(p, Point(x=11, y=22))
30 self.assertEqual(p, Point(11, y=22))
31 self.assertEqual(p, Point(y=22, x=11))
32 self.assertEqual(p, Point(*(11, 22)))
33 self.assertEqual(p, Point(**dict(x=11, y=22)))
34 self.assertRaises(TypeError, Point, 1) # too few args
35 self.assertRaises(TypeError, Point, 1, 2, 3) # too many args
36 self.assertRaises(TypeError, eval, 'Point(XXX=1, y=2)', locals()) # wrong keyword argument
37 self.assertRaises(TypeError, eval, 'Point(x=1)', locals()) # missing keyword argument
38 self.assertEqual(repr(p), 'Point(x=11, y=22)')
39 self.assert_('__dict__' not in dir(p)) # verify instance has no dict
40 self.assert_('__weakref__' not in dir(p))
41
42 def test_tupleness(self):
43 Point = NamedTuple('Point', 'x y')
44 p = Point(11, 22)
45
46 self.assert_(isinstance(p, tuple))
47 self.assertEqual(p, (11, 22)) # matches a real tuple
48 self.assertEqual(tuple(p), (11, 22)) # coercable to a real tuple
49 self.assertEqual(list(p), [11, 22]) # coercable to a list
50 self.assertEqual(max(p), 22) # iterable
51 self.assertEqual(max(*p), 22) # star-able
52 x, y = p
53 self.assertEqual(p, (x, y)) # unpacks like a tuple
54 self.assertEqual((p[0], p[1]), (11, 22)) # indexable like a tuple
55 self.assertRaises(IndexError, p.__getitem__, 3)
56
57 self.assertEqual(p.x, x)
58 self.assertEqual(p.y, y)
59 self.assertRaises(AttributeError, eval, 'p.z', locals())
60
61
Guido van Rossumcd16bf62007-06-13 18:07:49 +000062class TestOneTrickPonyABCs(unittest.TestCase):
63
64 def test_Hashable(self):
65 # Check some non-hashables
66 non_samples = [bytes(), list(), set(), dict()]
67 for x in non_samples:
68 self.failIf(isinstance(x, Hashable), repr(x))
69 self.failIf(issubclass(type(x), Hashable), repr(type(x)))
70 # Check some hashables
71 samples = [None,
72 int(), float(), complex(),
Guido van Rossum07d4e782007-07-03 16:59:47 +000073 str(),
Guido van Rossumcd16bf62007-06-13 18:07:49 +000074 tuple(), frozenset(),
75 int, list, object, type,
76 ]
77 for x in samples:
78 self.failUnless(isinstance(x, Hashable), repr(x))
79 self.failUnless(issubclass(type(x), Hashable), repr(type(x)))
80 self.assertRaises(TypeError, Hashable)
81 # Check direct subclassing
82 class H(Hashable):
83 def __hash__(self):
84 return super().__hash__()
85 self.assertEqual(hash(H()), 0)
86 self.failIf(issubclass(int, H))
87
88 def test_Iterable(self):
89 # Check some non-iterables
90 non_samples = [None, 42, 3.14, 1j]
91 for x in non_samples:
92 self.failIf(isinstance(x, Iterable), repr(x))
93 self.failIf(issubclass(type(x), Iterable), repr(type(x)))
94 # Check some iterables
Guido van Rossum07d4e782007-07-03 16:59:47 +000095 samples = [bytes(), str(),
Guido van Rossumcd16bf62007-06-13 18:07:49 +000096 tuple(), list(), set(), frozenset(), dict(),
97 dict().keys(), dict().items(), dict().values(),
98 (lambda: (yield))(),
99 (x for x in []),
100 ]
101 for x in samples:
102 self.failUnless(isinstance(x, Iterable), repr(x))
103 self.failUnless(issubclass(type(x), Iterable), repr(type(x)))
104 # Check direct subclassing
105 class I(Iterable):
106 def __iter__(self):
107 return super().__iter__()
108 self.assertEqual(list(I()), [])
109 self.failIf(issubclass(str, I))
110
111 def test_Iterator(self):
Guido van Rossum07d4e782007-07-03 16:59:47 +0000112 non_samples = [None, 42, 3.14, 1j, b"", "", (), [], {}, set()]
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000113 for x in non_samples:
114 self.failIf(isinstance(x, Iterator), repr(x))
115 self.failIf(issubclass(type(x), Iterator), repr(type(x)))
Guido van Rossum07d4e782007-07-03 16:59:47 +0000116 samples = [iter(bytes()), iter(str()),
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000117 iter(tuple()), iter(list()), iter(dict()),
118 iter(set()), iter(frozenset()),
119 iter(dict().keys()), iter(dict().items()),
120 iter(dict().values()),
121 (lambda: (yield))(),
122 (x for x in []),
123 ]
124 for x in samples:
125 self.failUnless(isinstance(x, Iterator), repr(x))
126 self.failUnless(issubclass(type(x), Iterator), repr(type(x)))
127
128 def test_Sized(self):
129 non_samples = [None, 42, 3.14, 1j,
130 (lambda: (yield))(),
131 (x for x in []),
132 ]
133 for x in non_samples:
134 self.failIf(isinstance(x, Sized), repr(x))
135 self.failIf(issubclass(type(x), Sized), repr(type(x)))
Guido van Rossum07d4e782007-07-03 16:59:47 +0000136 samples = [bytes(), str(),
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000137 tuple(), list(), set(), frozenset(), dict(),
138 dict().keys(), dict().items(), dict().values(),
139 ]
140 for x in samples:
141 self.failUnless(isinstance(x, Sized), repr(x))
142 self.failUnless(issubclass(type(x), Sized), repr(type(x)))
143
144 def test_Container(self):
145 non_samples = [None, 42, 3.14, 1j,
146 (lambda: (yield))(),
147 (x for x in []),
148 ]
149 for x in non_samples:
150 self.failIf(isinstance(x, Container), repr(x))
151 self.failIf(issubclass(type(x), Container), repr(type(x)))
Guido van Rossum07d4e782007-07-03 16:59:47 +0000152 samples = [bytes(), str(),
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000153 tuple(), list(), set(), frozenset(), dict(),
154 dict().keys(), dict().items(),
155 ]
156 for x in samples:
157 self.failUnless(isinstance(x, Container), repr(x))
158 self.failUnless(issubclass(type(x), Container), repr(type(x)))
159
160 def test_Callable(self):
161 non_samples = [None, 42, 3.14, 1j,
162 "", b"", (), [], {}, set(),
163 (lambda: (yield))(),
164 (x for x in []),
165 ]
166 for x in non_samples:
167 self.failIf(isinstance(x, Callable), repr(x))
168 self.failIf(issubclass(type(x), Callable), repr(type(x)))
169 samples = [lambda: None,
170 type, int, object,
171 len,
172 list.append, [].append,
173 ]
174 for x in samples:
175 self.failUnless(isinstance(x, Callable), repr(x))
176 self.failUnless(issubclass(type(x), Callable), repr(type(x)))
177
178 def test_direct_subclassing(self):
179 for B in Hashable, Iterable, Iterator, Sized, Container, Callable:
180 class C(B):
181 pass
182 self.failUnless(issubclass(C, B))
183 self.failIf(issubclass(int, C))
184
185 def test_registration(self):
186 for B in Hashable, Iterable, Iterator, Sized, Container, Callable:
187 class C:
188 __hash__ = None # Make sure it isn't hashable by default
189 self.failIf(issubclass(C, B), B.__name__)
190 B.register(C)
191 self.failUnless(issubclass(C, B))
192
193
194class TestCollectionABCs(unittest.TestCase):
195
196 # XXX For now, we only test some virtual inheritance properties.
197 # We should also test the proper behavior of the collection ABCs
198 # as real base classes or mix-in classes.
199
200 def test_Set(self):
201 for sample in [set, frozenset]:
202 self.failUnless(isinstance(sample(), Set))
203 self.failUnless(issubclass(sample, Set))
204
205 def test_MutableSet(self):
206 self.failUnless(isinstance(set(), MutableSet))
207 self.failUnless(issubclass(set, MutableSet))
208 self.failIf(isinstance(frozenset(), MutableSet))
209 self.failIf(issubclass(frozenset, MutableSet))
210
211 def test_Mapping(self):
212 for sample in [dict]:
213 self.failUnless(isinstance(sample(), Mapping))
214 self.failUnless(issubclass(sample, Mapping))
215
216 def test_MutableMapping(self):
217 for sample in [dict]:
218 self.failUnless(isinstance(sample(), MutableMapping))
219 self.failUnless(issubclass(sample, MutableMapping))
220
221 def test_Sequence(self):
222 for sample in [tuple, list, bytes, str]:
223 self.failUnless(isinstance(sample(), Sequence))
224 self.failUnless(issubclass(sample, Sequence))
225 self.failUnless(issubclass(basestring, Sequence))
226
227 def test_MutableSequence(self):
228 for sample in [tuple, str]:
229 self.failIf(isinstance(sample(), MutableSequence))
230 self.failIf(issubclass(sample, MutableSequence))
231 for sample in [list, bytes]:
232 self.failUnless(isinstance(sample(), MutableSequence))
233 self.failUnless(issubclass(sample, MutableSequence))
234 self.failIf(issubclass(basestring, MutableSequence))
235
236
Guido van Rossumd8faa362007-04-27 19:54:29 +0000237def test_main(verbose=None):
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000238 import collections as CollectionsModule
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000239 test_classes = [TestNamedTuple, TestOneTrickPonyABCs, TestCollectionABCs]
Guido van Rossumd8faa362007-04-27 19:54:29 +0000240 test_support.run_unittest(*test_classes)
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000241 test_support.run_doctest(CollectionsModule, verbose)
Guido van Rossumd8faa362007-04-27 19:54:29 +0000242
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000243
Guido van Rossumd8faa362007-04-27 19:54:29 +0000244if __name__ == "__main__":
245 test_main(verbose=True)