1ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
2ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehimport unittest, doctest, operator
3ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehimport inspect
4ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehfrom test import test_support
5ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehfrom collections import namedtuple, Counter, OrderedDict
6ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehfrom test import mapping_tests
7ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehimport pickle, cPickle, copy
8ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehfrom random import randrange, shuffle
9ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehimport keyword
10ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehimport re
11ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehimport sys
12ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehfrom collections import Hashable, Iterable, Iterator
13ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehfrom collections import Sized, Container, Callable
14ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehfrom collections import Set, MutableSet
15ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehfrom collections import Mapping, MutableMapping
16ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehfrom collections import Sequence, MutableSequence
17ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
18ffab958fd8d42ed7227d83007350e61555a1fa36Andrew HsiehTestNT = namedtuple('TestNT', 'x y z')    # type used for pickle tests
19ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
20ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehclass TestNamedTuple(unittest.TestCase):
21ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
22ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def test_factory(self):
23ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        Point = namedtuple('Point', 'x y')
24ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(Point.__name__, 'Point')
25ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(Point.__slots__, ())
26ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(Point.__module__, __name__)
27ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(Point.__getitem__, tuple.__getitem__)
28ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(Point._fields, ('x', 'y'))
29ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
30ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertRaises(ValueError, namedtuple, 'abc%', 'efg ghi')       # type has non-alpha char
31ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertRaises(ValueError, namedtuple, 'class', 'efg ghi')      # type has keyword
32ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertRaises(ValueError, namedtuple, '9abc', 'efg ghi')       # type starts with digit
33ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
34ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertRaises(ValueError, namedtuple, 'abc', 'efg g%hi')       # field with non-alpha char
35ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertRaises(ValueError, namedtuple, 'abc', 'abc class')      # field has keyword
36ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertRaises(ValueError, namedtuple, 'abc', '8efg 9ghi')      # field starts with digit
37ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertRaises(ValueError, namedtuple, 'abc', '_efg ghi')       # field with leading underscore
38ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertRaises(ValueError, namedtuple, 'abc', 'efg efg ghi')    # duplicate field
39ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
40ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        namedtuple('Point0', 'x1 y2')   # Verify that numbers are allowed in names
41ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        namedtuple('_', 'a b c')        # Test leading underscores in a typename
42ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
43ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        nt = namedtuple('nt', u'the quick brown fox')                       # check unicode input
44ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertNotIn("u'", repr(nt._fields))
45ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        nt = namedtuple('nt', (u'the', u'quick'))                           # check unicode input
46ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertNotIn("u'", repr(nt._fields))
47ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
48ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertRaises(TypeError, Point._make, [11])                     # catch too few args
49ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertRaises(TypeError, Point._make, [11, 22, 33])             # catch too many args
50ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
51ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    @unittest.skipIf(sys.flags.optimize >= 2,
52ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                     "Docstrings are omitted with -O2 and above")
53ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def test_factory_doc_attr(self):
54ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        Point = namedtuple('Point', 'x y')
55ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(Point.__doc__, 'Point(x, y)')
56ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
57ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def test_name_fixer(self):
58ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        for spec, renamed in [
59ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            [('efg', 'g%hi'),  ('efg', '_1')],                              # field with non-alpha char
60ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            [('abc', 'class'), ('abc', '_1')],                              # field has keyword
61ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            [('8efg', '9ghi'), ('_0', '_1')],                               # field starts with digit
62ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            [('abc', '_efg'), ('abc', '_1')],                               # field with leading underscore
63ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            [('abc', 'efg', 'efg', 'ghi'), ('abc', 'efg', '_2', 'ghi')],    # duplicate field
64ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            [('abc', '', 'x'), ('abc', '_1', 'x')],                         # fieldname is a space
65ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ]:
66ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            self.assertEqual(namedtuple('NT', spec, rename=True)._fields, renamed)
67ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
68ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def test_instance(self):
69ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        Point = namedtuple('Point', 'x y')
70ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        p = Point(11, 22)
71ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(p, Point(x=11, y=22))
72ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(p, Point(11, y=22))
73ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(p, Point(y=22, x=11))
74ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(p, Point(*(11, 22)))
75ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(p, Point(**dict(x=11, y=22)))
76ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertRaises(TypeError, Point, 1)                              # too few args
77ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertRaises(TypeError, Point, 1, 2, 3)                        # too many args
78ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertRaises(TypeError, eval, 'Point(XXX=1, y=2)', locals())   # wrong keyword argument
79ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertRaises(TypeError, eval, 'Point(x=1)', locals())          # missing keyword argument
80ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(repr(p), 'Point(x=11, y=22)')
81ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertNotIn('__dict__', dir(p))                              # verify instance has no dict
82ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertNotIn('__weakref__', dir(p))
83ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(p, Point._make([11, 22]))                          # test _make classmethod
84ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(p._fields, ('x', 'y'))                             # test _fields attribute
85ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(p._replace(x=1), (1, 22))                          # test _replace method
86ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(p._asdict(), dict(x=11, y=22))                     # test _asdict method
87ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
88ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        try:
89ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            p._replace(x=1, error=2)
90ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        except ValueError:
91ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            pass
92ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        else:
93ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            self._fail('Did not detect an incorrect fieldname')
94ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
95ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        # verify that field string can have commas
96ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        Point = namedtuple('Point', 'x, y')
97ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        p = Point(x=11, y=22)
98ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(repr(p), 'Point(x=11, y=22)')
99ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
100ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        # verify that fieldspec can be a non-string sequence
101ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        Point = namedtuple('Point', ('x', 'y'))
102ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        p = Point(x=11, y=22)
103ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(repr(p), 'Point(x=11, y=22)')
104ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
105ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def test_tupleness(self):
106ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        Point = namedtuple('Point', 'x y')
107ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        p = Point(11, 22)
108ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
109ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertIsInstance(p, tuple)
110ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(p, (11, 22))                                       # matches a real tuple
111ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(tuple(p), (11, 22))                                # coercable to a real tuple
112ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(list(p), [11, 22])                                 # coercable to a list
113ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(max(p), 22)                                        # iterable
114ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(max(*p), 22)                                       # star-able
115ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        x, y = p
116ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(p, (x, y))                                         # unpacks like a tuple
117ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual((p[0], p[1]), (11, 22))                            # indexable like a tuple
118ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertRaises(IndexError, p.__getitem__, 3)
119ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
120ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(p.x, x)
121ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(p.y, y)
122ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertRaises(AttributeError, eval, 'p.z', locals())
123ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
124ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def test_odd_sizes(self):
125ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        Zero = namedtuple('Zero', '')
126ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(Zero(), ())
127ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(Zero._make([]), ())
128ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(repr(Zero()), 'Zero()')
129ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(Zero()._asdict(), {})
130ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(Zero()._fields, ())
131ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
132ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        Dot = namedtuple('Dot', 'd')
133ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(Dot(1), (1,))
134ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(Dot._make([1]), (1,))
135ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(Dot(1).d, 1)
136ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(repr(Dot(1)), 'Dot(d=1)')
137ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(Dot(1)._asdict(), {'d':1})
138ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(Dot(1)._replace(d=999), (999,))
139ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(Dot(1)._fields, ('d',))
140ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
141ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        n = 5000
142ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        import string, random
143ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        names = list(set(''.join([random.choice(string.ascii_letters)
144ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                                  for j in range(10)]) for i in range(n)))
145ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        n = len(names)
146ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        Big = namedtuple('Big', names)
147ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        b = Big(*range(n))
148ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(b, tuple(range(n)))
149ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(Big._make(range(n)), tuple(range(n)))
150ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        for pos, name in enumerate(names):
151ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            self.assertEqual(getattr(b, name), pos)
152ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        repr(b)                                 # make sure repr() doesn't blow-up
153ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        d = b._asdict()
154ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        d_expected = dict(zip(names, range(n)))
155ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(d, d_expected)
156ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        b2 = b._replace(**dict([(names[1], 999),(names[-5], 42)]))
157ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        b2_expected = range(n)
158ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        b2_expected[1] = 999
159ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        b2_expected[-5] = 42
160ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(b2, tuple(b2_expected))
161ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(b._fields, tuple(names))
162ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
163ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def test_pickle(self):
164ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        p = TestNT(x=10, y=20, z=30)
165ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        for module in pickle, cPickle:
166ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            loads = getattr(module, 'loads')
167ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            dumps = getattr(module, 'dumps')
168ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            for protocol in -1, 0, 1, 2:
169ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                q = loads(dumps(p, protocol))
170ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                self.assertEqual(p, q)
171ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                self.assertEqual(p._fields, q._fields)
172ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
173ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def test_copy(self):
174ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        p = TestNT(x=10, y=20, z=30)
175ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        for copier in copy.copy, copy.deepcopy:
176ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            q = copier(p)
177ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            self.assertEqual(p, q)
178ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            self.assertEqual(p._fields, q._fields)
179ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
180ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def test_name_conflicts(self):
181ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        # Some names like "self", "cls", "tuple", "itemgetter", and "property"
182ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        # failed when used as field names.  Test to make sure these now work.
183ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        T = namedtuple('T', 'itemgetter property self cls tuple')
184ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        t = T(1, 2, 3, 4, 5)
185ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(t, (1,2,3,4,5))
186ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        newt = t._replace(itemgetter=10, property=20, self=30, cls=40, tuple=50)
187ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(newt, (10,20,30,40,50))
188ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
189ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        # Broader test of all interesting names in a template
190ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        with test_support.captured_stdout() as template:
191ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            T = namedtuple('T', 'x', verbose=True)
192ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        words = set(re.findall('[A-Za-z]+', template.getvalue()))
193ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        words -= set(keyword.kwlist)
194ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        T = namedtuple('T', words)
195ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        # test __new__
196ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        values = tuple(range(len(words)))
197ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        t = T(*values)
198ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(t, values)
199ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        t = T(**dict(zip(T._fields, values)))
200ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(t, values)
201ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        # test _make
202ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        t = T._make(values)
203ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(t, values)
204ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        # exercise __repr__
205ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        repr(t)
206ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        # test _asdict
207ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(t._asdict(), dict(zip(T._fields, values)))
208ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        # test _replace
209ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        t = T._make(values)
210ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        newvalues = tuple(v*10 for v in values)
211ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        newt = t._replace(**dict(zip(T._fields, newvalues)))
212ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(newt, newvalues)
213ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        # test _fields
214ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(T._fields, tuple(words))
215ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        # test __getnewargs__
216ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(t.__getnewargs__(), values)
217ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
218ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehclass ABCTestCase(unittest.TestCase):
219ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
220ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def validate_abstract_methods(self, abc, *names):
221ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        methodstubs = dict.fromkeys(names, lambda s, *args: 0)
222ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
223ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        # everything should work will all required methods are present
224ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        C = type('C', (abc,), methodstubs)
225ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        C()
226ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
227ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        # instantiation should fail if a required method is missing
228ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        for name in names:
229ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            stubs = methodstubs.copy()
230ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            del stubs[name]
231ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            C = type('C', (abc,), stubs)
232ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            self.assertRaises(TypeError, C, name)
233ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
234ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def validate_isinstance(self, abc, name):
235ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        stub = lambda s, *args: 0
236ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
237ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        # new-style class
238ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        C = type('C', (object,), {name: stub})
239ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertIsInstance(C(), abc)
240ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertTrue(issubclass(C, abc))
241ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        # old-style class
242ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        class C: pass
243ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        setattr(C, name, stub)
244ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertIsInstance(C(), abc)
245ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertTrue(issubclass(C, abc))
246ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
247ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        # new-style class
248ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        C = type('C', (object,), {'__hash__': None})
249ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertNotIsInstance(C(), abc)
250ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertFalse(issubclass(C, abc))
251ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        # old-style class
252ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        class C: pass
253ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertNotIsInstance(C(), abc)
254ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertFalse(issubclass(C, abc))
255ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
256ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def validate_comparison(self, instance):
257ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ops = ['lt', 'gt', 'le', 'ge', 'ne', 'or', 'and', 'xor', 'sub']
258ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        operators = {}
259ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        for op in ops:
260ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            name = '__' + op + '__'
261ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            operators[name] = getattr(operator, name)
262ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
263ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        class Other:
264ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            def __init__(self):
265ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                self.right_side = False
266ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            def __eq__(self, other):
267ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                self.right_side = True
268ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                return True
269ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            __lt__ = __eq__
270ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            __gt__ = __eq__
271ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            __le__ = __eq__
272ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            __ge__ = __eq__
273ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            __ne__ = __eq__
274ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            __ror__ = __eq__
275ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            __rand__ = __eq__
276ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            __rxor__ = __eq__
277ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            __rsub__ = __eq__
278ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
279ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        for name, op in operators.items():
280ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            if not hasattr(instance, name):
281ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                continue
282ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            other = Other()
283ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            op(instance, other)
284ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            self.assertTrue(other.right_side,'Right side not called for %s.%s'
285ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                            % (type(instance), name))
286ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
287ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehclass TestOneTrickPonyABCs(ABCTestCase):
288ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
289ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def test_Hashable(self):
290ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        # Check some non-hashables
291ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        non_samples = [list(), set(), dict()]
292ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        for x in non_samples:
293ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            self.assertNotIsInstance(x, Hashable)
294ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            self.assertFalse(issubclass(type(x), Hashable), repr(type(x)))
295ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        # Check some hashables
296ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        samples = [None,
297ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                   int(), float(), complex(),
298ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                   str(),
299ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                   tuple(), frozenset(),
300ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                   int, list, object, type,
301ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                   ]
302ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        for x in samples:
303ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            self.assertIsInstance(x, Hashable)
304ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            self.assertTrue(issubclass(type(x), Hashable), repr(type(x)))
305ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertRaises(TypeError, Hashable)
306ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        # Check direct subclassing
307ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        class H(Hashable):
308ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            def __hash__(self):
309ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                return super(H, self).__hash__()
310ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            __eq__ = Hashable.__eq__ # Silence Py3k warning
311ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(hash(H()), 0)
312ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertFalse(issubclass(int, H))
313ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.validate_abstract_methods(Hashable, '__hash__')
314ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.validate_isinstance(Hashable, '__hash__')
315ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
316ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def test_Iterable(self):
317ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        # Check some non-iterables
318ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        non_samples = [None, 42, 3.14, 1j]
319ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        for x in non_samples:
320ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            self.assertNotIsInstance(x, Iterable)
321ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            self.assertFalse(issubclass(type(x), Iterable), repr(type(x)))
322ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        # Check some iterables
323ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        samples = [str(),
324ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                   tuple(), list(), set(), frozenset(), dict(),
325ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                   dict().keys(), dict().items(), dict().values(),
326ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                   (lambda: (yield))(),
327ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                   (x for x in []),
328ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                   ]
329ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        for x in samples:
330ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            self.assertIsInstance(x, Iterable)
331ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            self.assertTrue(issubclass(type(x), Iterable), repr(type(x)))
332ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        # Check direct subclassing
333ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        class I(Iterable):
334ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            def __iter__(self):
335ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                return super(I, self).__iter__()
336ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(list(I()), [])
337ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertFalse(issubclass(str, I))
338ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.validate_abstract_methods(Iterable, '__iter__')
339ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.validate_isinstance(Iterable, '__iter__')
340ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
341ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def test_Iterator(self):
342ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        non_samples = [None, 42, 3.14, 1j, "".encode('ascii'), "", (), [],
343ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            {}, set()]
344ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        for x in non_samples:
345ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            self.assertNotIsInstance(x, Iterator)
346ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            self.assertFalse(issubclass(type(x), Iterator), repr(type(x)))
347ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        samples = [iter(str()),
348ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                   iter(tuple()), iter(list()), iter(dict()),
349ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                   iter(set()), iter(frozenset()),
350ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                   iter(dict().keys()), iter(dict().items()),
351ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                   iter(dict().values()),
352ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                   (lambda: (yield))(),
353ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                   (x for x in []),
354ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                   ]
355ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        for x in samples:
356ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            self.assertIsInstance(x, Iterator)
357ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            self.assertTrue(issubclass(type(x), Iterator), repr(type(x)))
358ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.validate_abstract_methods(Iterator, 'next', '__iter__')
359ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
360ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        # Issue 10565
361ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        class NextOnly:
362ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            def __next__(self):
363ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                yield 1
364ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                raise StopIteration
365ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertNotIsInstance(NextOnly(), Iterator)
366ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        class NextOnlyNew(object):
367ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            def __next__(self):
368ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                yield 1
369ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                raise StopIteration
370ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertNotIsInstance(NextOnlyNew(), Iterator)
371ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
372ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def test_Sized(self):
373ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        non_samples = [None, 42, 3.14, 1j,
374ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                       (lambda: (yield))(),
375ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                       (x for x in []),
376ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                       ]
377ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        for x in non_samples:
378ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            self.assertNotIsInstance(x, Sized)
379ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            self.assertFalse(issubclass(type(x), Sized), repr(type(x)))
380ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        samples = [str(),
381ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                   tuple(), list(), set(), frozenset(), dict(),
382ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                   dict().keys(), dict().items(), dict().values(),
383ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                   ]
384ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        for x in samples:
385ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            self.assertIsInstance(x, Sized)
386ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            self.assertTrue(issubclass(type(x), Sized), repr(type(x)))
387ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.validate_abstract_methods(Sized, '__len__')
388ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.validate_isinstance(Sized, '__len__')
389ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
390ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def test_Container(self):
391ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        non_samples = [None, 42, 3.14, 1j,
392ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                       (lambda: (yield))(),
393ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                       (x for x in []),
394ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                       ]
395ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        for x in non_samples:
396ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            self.assertNotIsInstance(x, Container)
397ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            self.assertFalse(issubclass(type(x), Container), repr(type(x)))
398ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        samples = [str(),
399ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                   tuple(), list(), set(), frozenset(), dict(),
400ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                   dict().keys(), dict().items(),
401ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                   ]
402ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        for x in samples:
403ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            self.assertIsInstance(x, Container)
404ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            self.assertTrue(issubclass(type(x), Container), repr(type(x)))
405ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.validate_abstract_methods(Container, '__contains__')
406ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.validate_isinstance(Container, '__contains__')
407ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
408ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def test_Callable(self):
409ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        non_samples = [None, 42, 3.14, 1j,
410ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                       "", "".encode('ascii'), (), [], {}, set(),
411ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                       (lambda: (yield))(),
412ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                       (x for x in []),
413ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                       ]
414ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        for x in non_samples:
415ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            self.assertNotIsInstance(x, Callable)
416ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            self.assertFalse(issubclass(type(x), Callable), repr(type(x)))
417ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        samples = [lambda: None,
418ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                   type, int, object,
419ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                   len,
420ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                   list.append, [].append,
421ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                   ]
422ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        for x in samples:
423ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            self.assertIsInstance(x, Callable)
424ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            self.assertTrue(issubclass(type(x), Callable), repr(type(x)))
425ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.validate_abstract_methods(Callable, '__call__')
426ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.validate_isinstance(Callable, '__call__')
427ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
428ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def test_direct_subclassing(self):
429ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        for B in Hashable, Iterable, Iterator, Sized, Container, Callable:
430ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            class C(B):
431ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                pass
432ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            self.assertTrue(issubclass(C, B))
433ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            self.assertFalse(issubclass(int, C))
434ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
435ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def test_registration(self):
436ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        for B in Hashable, Iterable, Iterator, Sized, Container, Callable:
437ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            class C:
438ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                __metaclass__ = type
439ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                __hash__ = None  # Make sure it isn't hashable by default
440ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            self.assertFalse(issubclass(C, B), B.__name__)
441ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            B.register(C)
442ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            self.assertTrue(issubclass(C, B))
443ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
444ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehclass WithSet(MutableSet):
445ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
446ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def __init__(self, it=()):
447ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.data = set(it)
448ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
449ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def __len__(self):
450ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        return len(self.data)
451ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
452ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def __iter__(self):
453ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        return iter(self.data)
454ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
455ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def __contains__(self, item):
456ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        return item in self.data
457ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
458ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def add(self, item):
459ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.data.add(item)
460ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
461ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def discard(self, item):
462ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.data.discard(item)
463ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
464ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehclass TestCollectionABCs(ABCTestCase):
465ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
466ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    # XXX For now, we only test some virtual inheritance properties.
467ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    # We should also test the proper behavior of the collection ABCs
468ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    # as real base classes or mix-in classes.
469ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
470ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def test_Set(self):
471ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        for sample in [set, frozenset]:
472ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            self.assertIsInstance(sample(), Set)
473ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            self.assertTrue(issubclass(sample, Set))
474ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.validate_abstract_methods(Set, '__contains__', '__iter__', '__len__')
475ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        class MySet(Set):
476ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            def __contains__(self, x):
477ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                return False
478ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            def __len__(self):
479ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                return 0
480ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            def __iter__(self):
481ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                return iter([])
482ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.validate_comparison(MySet())
483ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
484ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def test_hash_Set(self):
485ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        class OneTwoThreeSet(Set):
486ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            def __init__(self):
487ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                self.contents = [1, 2, 3]
488ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            def __contains__(self, x):
489ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                return x in self.contents
490ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            def __len__(self):
491ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                return len(self.contents)
492ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            def __iter__(self):
493ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                return iter(self.contents)
494ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            def __hash__(self):
495ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                return self._hash()
496ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        a, b = OneTwoThreeSet(), OneTwoThreeSet()
497ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertTrue(hash(a) == hash(b))
498ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
499ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def test_MutableSet(self):
500ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertIsInstance(set(), MutableSet)
501ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertTrue(issubclass(set, MutableSet))
502ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertNotIsInstance(frozenset(), MutableSet)
503ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertFalse(issubclass(frozenset, MutableSet))
504ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.validate_abstract_methods(MutableSet, '__contains__', '__iter__', '__len__',
505ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            'add', 'discard')
506ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
507ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def test_issue_5647(self):
508ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        # MutableSet.__iand__ mutated the set during iteration
509ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        s = WithSet('abcd')
510ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        s &= WithSet('cdef')            # This used to fail
511ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(set(s), set('cd'))
512ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
513ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def test_issue_4920(self):
514ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        # MutableSet.pop() method did not work
515ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        class MySet(collections.MutableSet):
516ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            __slots__=['__s']
517ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            def __init__(self,items=None):
518ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                if items is None:
519ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                    items=[]
520ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                self.__s=set(items)
521ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            def __contains__(self,v):
522ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                return v in self.__s
523ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            def __iter__(self):
524ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                return iter(self.__s)
525ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            def __len__(self):
526ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                return len(self.__s)
527ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            def add(self,v):
528ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                result=v not in self.__s
529ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                self.__s.add(v)
530ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                return result
531ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            def discard(self,v):
532ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                result=v in self.__s
533ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                self.__s.discard(v)
534ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                return result
535ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            def __repr__(self):
536ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                return "MySet(%s)" % repr(list(self))
537ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        s = MySet([5,43,2,1])
538ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(s.pop(), 1)
539ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
540ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def test_issue8750(self):
541ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        empty = WithSet()
542ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        full = WithSet(range(10))
543ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        s = WithSet(full)
544ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        s -= s
545ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(s, empty)
546ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        s = WithSet(full)
547ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        s ^= s
548ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(s, empty)
549ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        s = WithSet(full)
550ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        s &= s
551ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(s, full)
552ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        s |= s
553ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(s, full)
554ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
555ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def test_Mapping(self):
556ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        for sample in [dict]:
557ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            self.assertIsInstance(sample(), Mapping)
558ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            self.assertTrue(issubclass(sample, Mapping))
559ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.validate_abstract_methods(Mapping, '__contains__', '__iter__', '__len__',
560ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            '__getitem__')
561ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        class MyMapping(collections.Mapping):
562ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            def __len__(self):
563ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                return 0
564ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            def __getitem__(self, i):
565ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                raise IndexError
566ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            def __iter__(self):
567ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                return iter(())
568ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.validate_comparison(MyMapping())
569ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
570ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def test_MutableMapping(self):
571ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        for sample in [dict]:
572ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            self.assertIsInstance(sample(), MutableMapping)
573ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            self.assertTrue(issubclass(sample, MutableMapping))
574ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.validate_abstract_methods(MutableMapping, '__contains__', '__iter__', '__len__',
575ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            '__getitem__', '__setitem__', '__delitem__')
576ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
577ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def test_Sequence(self):
578ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        for sample in [tuple, list, str]:
579ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            self.assertIsInstance(sample(), Sequence)
580ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            self.assertTrue(issubclass(sample, Sequence))
581ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertTrue(issubclass(basestring, Sequence))
582ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertIsInstance(range(10), Sequence)
583ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertTrue(issubclass(xrange, Sequence))
584ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertTrue(issubclass(str, Sequence))
585ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.validate_abstract_methods(Sequence, '__contains__', '__iter__', '__len__',
586ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            '__getitem__')
587ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
588ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def test_MutableSequence(self):
589ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        for sample in [tuple, str]:
590ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            self.assertNotIsInstance(sample(), MutableSequence)
591ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            self.assertFalse(issubclass(sample, MutableSequence))
592ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        for sample in [list]:
593ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            self.assertIsInstance(sample(), MutableSequence)
594ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            self.assertTrue(issubclass(sample, MutableSequence))
595ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertFalse(issubclass(basestring, MutableSequence))
596ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.validate_abstract_methods(MutableSequence, '__contains__', '__iter__',
597ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            '__len__', '__getitem__', '__setitem__', '__delitem__', 'insert')
598ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
599ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehclass TestCounter(unittest.TestCase):
600ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
601ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def test_basics(self):
602ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        c = Counter('abcaba')
603ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(c, Counter({'a':3 , 'b': 2, 'c': 1}))
604ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(c, Counter(a=3, b=2, c=1))
605ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertIsInstance(c, dict)
606ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertIsInstance(c, Mapping)
607ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertTrue(issubclass(Counter, dict))
608ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertTrue(issubclass(Counter, Mapping))
609ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(len(c), 3)
610ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(sum(c.values()), 6)
611ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(sorted(c.values()), [1, 2, 3])
612ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(sorted(c.keys()), ['a', 'b', 'c'])
613ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(sorted(c), ['a', 'b', 'c'])
614ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(sorted(c.items()),
615ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                         [('a', 3), ('b', 2), ('c', 1)])
616ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(c['b'], 2)
617ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(c['z'], 0)
618ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        with test_support.check_py3k_warnings():
619ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            self.assertEqual(c.has_key('c'), True)
620ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            self.assertEqual(c.has_key('z'), False)
621ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(c.__contains__('c'), True)
622ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(c.__contains__('z'), False)
623ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(c.get('b', 10), 2)
624ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(c.get('z', 10), 10)
625ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(c, dict(a=3, b=2, c=1))
626ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(repr(c), "Counter({'a': 3, 'b': 2, 'c': 1})")
627ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(c.most_common(), [('a', 3), ('b', 2), ('c', 1)])
628ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        for i in range(5):
629ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            self.assertEqual(c.most_common(i),
630ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                             [('a', 3), ('b', 2), ('c', 1)][:i])
631ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(''.join(sorted(c.elements())), 'aaabbc')
632ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        c['a'] += 1         # increment an existing value
633ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        c['b'] -= 2         # sub existing value to zero
634ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        del c['c']          # remove an entry
635ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        del c['c']          # make sure that del doesn't raise KeyError
636ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        c['d'] -= 2         # sub from a missing value
637ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        c['e'] = -5         # directly assign a missing value
638ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        c['f'] += 4         # add to a missing value
639ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(c, dict(a=4, b=0, d=-2, e=-5, f=4))
640ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(''.join(sorted(c.elements())), 'aaaaffff')
641ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(c.pop('f'), 4)
642ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertNotIn('f', c)
643ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        for i in range(3):
644ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            elem, cnt = c.popitem()
645ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            self.assertNotIn(elem, c)
646ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        c.clear()
647ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(c, {})
648ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(repr(c), 'Counter()')
649ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertRaises(NotImplementedError, Counter.fromkeys, 'abc')
650ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertRaises(TypeError, hash, c)
651ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        c.update(dict(a=5, b=3))
652ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        c.update(c=1)
653ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        c.update(Counter('a' * 50 + 'b' * 30))
654ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        c.update()          # test case with no args
655ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        c.__init__('a' * 500 + 'b' * 300)
656ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        c.__init__('cdc')
657ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        c.__init__()
658ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(c, dict(a=555, b=333, c=3, d=1))
659ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(c.setdefault('d', 5), 1)
660ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(c['d'], 1)
661ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(c.setdefault('e', 5), 5)
662ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(c['e'], 5)
663ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
664ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def test_copying(self):
665ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        # Check that counters are copyable, deepcopyable, picklable, and
666ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        #have a repr/eval round-trip
667ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        words = Counter('which witch had which witches wrist watch'.split())
668ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        update_test = Counter()
669ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        update_test.update(words)
670ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        for i, dup in enumerate([
671ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                    words.copy(),
672ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                    copy.copy(words),
673ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                    copy.deepcopy(words),
674ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                    pickle.loads(pickle.dumps(words, 0)),
675ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                    pickle.loads(pickle.dumps(words, 1)),
676ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                    pickle.loads(pickle.dumps(words, 2)),
677ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                    pickle.loads(pickle.dumps(words, -1)),
678ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                    cPickle.loads(cPickle.dumps(words, 0)),
679ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                    cPickle.loads(cPickle.dumps(words, 1)),
680ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                    cPickle.loads(cPickle.dumps(words, 2)),
681ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                    cPickle.loads(cPickle.dumps(words, -1)),
682ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                    eval(repr(words)),
683ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                    update_test,
684ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                    Counter(words),
685ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                    ]):
686ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            msg = (i, dup, words)
687ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            self.assertTrue(dup is not words)
688ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            self.assertEqual(dup, words)
689ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            self.assertEqual(len(dup), len(words))
690ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            self.assertEqual(type(dup), type(words))
691ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
692ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def test_copy_subclass(self):
693ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        class MyCounter(Counter):
694ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            pass
695ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        c = MyCounter('slartibartfast')
696ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        d = c.copy()
697ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(d, c)
698ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(len(d), len(c))
699ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(type(d), type(c))
700ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
701ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def test_conversions(self):
702ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        # Convert to: set, list, dict
703ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        s = 'she sells sea shells by the sea shore'
704ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(sorted(Counter(s).elements()), sorted(s))
705ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(sorted(Counter(s)), sorted(set(s)))
706ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(dict(Counter(s)), dict(Counter(s).items()))
707ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(set(Counter(s)), set(s))
708ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
709ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def test_invariant_for_the_in_operator(self):
710ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        c = Counter(a=10, b=-2, c=0)
711ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        for elem in c:
712ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            self.assertTrue(elem in c)
713ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            self.assertIn(elem, c)
714ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
715ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def test_multiset_operations(self):
716ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        # Verify that adding a zero counter will strip zeros and negatives
717ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        c = Counter(a=10, b=-2, c=0) + Counter()
718ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(dict(c), dict(a=10))
719ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
720ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        elements = 'abcd'
721ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        for i in range(1000):
722ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            # test random pairs of multisets
723ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            p = Counter(dict((elem, randrange(-2,4)) for elem in elements))
724ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            p.update(e=1, f=-1, g=0)
725ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            q = Counter(dict((elem, randrange(-2,4)) for elem in elements))
726ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            q.update(h=1, i=-1, j=0)
727ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            for counterop, numberop in [
728ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                (Counter.__add__, lambda x, y: max(0, x+y)),
729ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                (Counter.__sub__, lambda x, y: max(0, x-y)),
730ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                (Counter.__or__, lambda x, y: max(0,x,y)),
731ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                (Counter.__and__, lambda x, y: max(0, min(x,y))),
732ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            ]:
733ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                result = counterop(p, q)
734ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                for x in elements:
735ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                    self.assertEqual(numberop(p[x], q[x]), result[x],
736ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                                     (counterop, x, p, q))
737ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                # verify that results exclude non-positive counts
738ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                self.assertTrue(x>0 for x in result.values())
739ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
740ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        elements = 'abcdef'
741ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        for i in range(100):
742ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            # verify that random multisets with no repeats are exactly like sets
743ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            p = Counter(dict((elem, randrange(0, 2)) for elem in elements))
744ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            q = Counter(dict((elem, randrange(0, 2)) for elem in elements))
745ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            for counterop, setop in [
746ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                (Counter.__sub__, set.__sub__),
747ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                (Counter.__or__, set.__or__),
748ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                (Counter.__and__, set.__and__),
749ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            ]:
750ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                counter_result = counterop(p, q)
751ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                set_result = setop(set(p.elements()), set(q.elements()))
752ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                self.assertEqual(counter_result, dict.fromkeys(set_result, 1))
753ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
754ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def test_subtract(self):
755ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        c = Counter(a=-5, b=0, c=5, d=10, e=15,g=40)
756ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        c.subtract(a=1, b=2, c=-3, d=10, e=20, f=30, h=-50)
757ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(c, Counter(a=-6, b=-2, c=8, d=0, e=-5, f=-30, g=40, h=50))
758ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        c = Counter(a=-5, b=0, c=5, d=10, e=15,g=40)
759ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        c.subtract(Counter(a=1, b=2, c=-3, d=10, e=20, f=30, h=-50))
760ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(c, Counter(a=-6, b=-2, c=8, d=0, e=-5, f=-30, g=40, h=50))
761ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        c = Counter('aaabbcd')
762ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        c.subtract('aaaabbcce')
763ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(c, Counter(a=-1, b=0, c=-1, d=1, e=-1))
764ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
765ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehclass TestOrderedDict(unittest.TestCase):
766ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
767ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def test_init(self):
768ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        with self.assertRaises(TypeError):
769ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            OrderedDict([('a', 1), ('b', 2)], None)                                 # too many args
770ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        pairs = [('a', 1), ('b', 2), ('c', 3), ('d', 4), ('e', 5)]
771ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(sorted(OrderedDict(dict(pairs)).items()), pairs)           # dict input
772ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(sorted(OrderedDict(**dict(pairs)).items()), pairs)         # kwds input
773ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(list(OrderedDict(pairs).items()), pairs)                   # pairs input
774ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(list(OrderedDict([('a', 1), ('b', 2), ('c', 9), ('d', 4)],
775ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                                          c=3, e=5).items()), pairs)                # mixed input
776ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
777ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        # make sure no positional args conflict with possible kwdargs
778ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(inspect.getargspec(OrderedDict.__dict__['__init__']).args,
779ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                         ['self'])
780ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
781ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        # Make sure that direct calls to __init__ do not clear previous contents
782ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        d = OrderedDict([('a', 1), ('b', 2), ('c', 3), ('d', 44), ('e', 55)])
783ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        d.__init__([('e', 5), ('f', 6)], g=7, d=4)
784ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(list(d.items()),
785ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            [('a', 1), ('b', 2), ('c', 3), ('d', 4), ('e', 5), ('f', 6), ('g', 7)])
786ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
787ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def test_update(self):
788ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        with self.assertRaises(TypeError):
789ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            OrderedDict().update([('a', 1), ('b', 2)], None)                        # too many args
790ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        pairs = [('a', 1), ('b', 2), ('c', 3), ('d', 4), ('e', 5)]
791ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        od = OrderedDict()
792ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        od.update(dict(pairs))
793ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(sorted(od.items()), pairs)                                 # dict input
794ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        od = OrderedDict()
795ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        od.update(**dict(pairs))
796ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(sorted(od.items()), pairs)                                 # kwds input
797ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        od = OrderedDict()
798ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        od.update(pairs)
799ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(list(od.items()), pairs)                                   # pairs input
800ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        od = OrderedDict()
801ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        od.update([('a', 1), ('b', 2), ('c', 9), ('d', 4)], c=3, e=5)
802ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(list(od.items()), pairs)                                   # mixed input
803ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
804ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        # Issue 9137: Named argument called 'other' or 'self'
805ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        # shouldn't be treated specially.
806ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        od = OrderedDict()
807ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        od.update(self=23)
808ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(list(od.items()), [('self', 23)])
809ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        od = OrderedDict()
810ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        od.update(other={})
811ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(list(od.items()), [('other', {})])
812ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        od = OrderedDict()
813ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        od.update(red=5, blue=6, other=7, self=8)
814ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(sorted(list(od.items())),
815ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                         [('blue', 6), ('other', 7), ('red', 5), ('self', 8)])
816ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
817ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        # Make sure that direct calls to update do not clear previous contents
818ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        # add that updates items are not moved to the end
819ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        d = OrderedDict([('a', 1), ('b', 2), ('c', 3), ('d', 44), ('e', 55)])
820ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        d.update([('e', 5), ('f', 6)], g=7, d=4)
821ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(list(d.items()),
822ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            [('a', 1), ('b', 2), ('c', 3), ('d', 4), ('e', 5), ('f', 6), ('g', 7)])
823ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
824ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def test_abc(self):
825ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertIsInstance(OrderedDict(), MutableMapping)
826ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertTrue(issubclass(OrderedDict, MutableMapping))
827ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
828ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def test_clear(self):
829ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        pairs = [('c', 1), ('b', 2), ('a', 3), ('d', 4), ('e', 5), ('f', 6)]
830ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        shuffle(pairs)
831ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        od = OrderedDict(pairs)
832ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(len(od), len(pairs))
833ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        od.clear()
834ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(len(od), 0)
835ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
836ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def test_delitem(self):
837ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        pairs = [('c', 1), ('b', 2), ('a', 3), ('d', 4), ('e', 5), ('f', 6)]
838ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        od = OrderedDict(pairs)
839ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        del od['a']
840ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertNotIn('a', od)
841ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        with self.assertRaises(KeyError):
842ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            del od['a']
843ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(list(od.items()), pairs[:2] + pairs[3:])
844ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
845ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def test_setitem(self):
846ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        od = OrderedDict([('d', 1), ('b', 2), ('c', 3), ('a', 4), ('e', 5)])
847ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        od['c'] = 10           # existing element
848ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        od['f'] = 20           # new element
849ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(list(od.items()),
850ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                         [('d', 1), ('b', 2), ('c', 10), ('a', 4), ('e', 5), ('f', 20)])
851ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
852ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def test_iterators(self):
853ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        pairs = [('c', 1), ('b', 2), ('a', 3), ('d', 4), ('e', 5), ('f', 6)]
854ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        shuffle(pairs)
855ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        od = OrderedDict(pairs)
856ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(list(od), [t[0] for t in pairs])
857ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(od.keys()[:], [t[0] for t in pairs])
858ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(od.values()[:], [t[1] for t in pairs])
859ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(od.items()[:], pairs)
860ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(list(od.iterkeys()), [t[0] for t in pairs])
861ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(list(od.itervalues()), [t[1] for t in pairs])
862ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(list(od.iteritems()), pairs)
863ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(list(reversed(od)),
864ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                         [t[0] for t in reversed(pairs)])
865ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
866ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def test_popitem(self):
867ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        pairs = [('c', 1), ('b', 2), ('a', 3), ('d', 4), ('e', 5), ('f', 6)]
868ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        shuffle(pairs)
869ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        od = OrderedDict(pairs)
870ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        while pairs:
871ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            self.assertEqual(od.popitem(), pairs.pop())
872ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        with self.assertRaises(KeyError):
873ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            od.popitem()
874ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(len(od), 0)
875ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
876ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def test_pop(self):
877ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        pairs = [('c', 1), ('b', 2), ('a', 3), ('d', 4), ('e', 5), ('f', 6)]
878ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        shuffle(pairs)
879ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        od = OrderedDict(pairs)
880ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        shuffle(pairs)
881ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        while pairs:
882ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            k, v = pairs.pop()
883ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            self.assertEqual(od.pop(k), v)
884ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        with self.assertRaises(KeyError):
885ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            od.pop('xyz')
886ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(len(od), 0)
887ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(od.pop(k, 12345), 12345)
888ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
889ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        # make sure pop still works when __missing__ is defined
890ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        class Missing(OrderedDict):
891ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            def __missing__(self, key):
892ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                return 0
893ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        m = Missing(a=1)
894ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(m.pop('b', 5), 5)
895ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(m.pop('a', 6), 1)
896ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(m.pop('a', 6), 6)
897ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        with self.assertRaises(KeyError):
898ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            m.pop('a')
899ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
900ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def test_equality(self):
901ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        pairs = [('c', 1), ('b', 2), ('a', 3), ('d', 4), ('e', 5), ('f', 6)]
902ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        shuffle(pairs)
903ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        od1 = OrderedDict(pairs)
904ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        od2 = OrderedDict(pairs)
905ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(od1, od2)          # same order implies equality
906ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        pairs = pairs[2:] + pairs[:2]
907ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        od2 = OrderedDict(pairs)
908ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertNotEqual(od1, od2)       # different order implies inequality
909ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        # comparison to regular dict is not order sensitive
910ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(od1, dict(od2))
911ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(dict(od2), od1)
912ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        # different length implied inequality
913ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertNotEqual(od1, OrderedDict(pairs[:-1]))
914ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
915ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def test_copying(self):
916ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        # Check that ordered dicts are copyable, deepcopyable, picklable,
917ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        # and have a repr/eval round-trip
918ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        pairs = [('c', 1), ('b', 2), ('a', 3), ('d', 4), ('e', 5), ('f', 6)]
919ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        od = OrderedDict(pairs)
920ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        update_test = OrderedDict()
921ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        update_test.update(od)
922ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        for i, dup in enumerate([
923ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                    od.copy(),
924ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                    copy.copy(od),
925ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                    copy.deepcopy(od),
926ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                    pickle.loads(pickle.dumps(od, 0)),
927ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                    pickle.loads(pickle.dumps(od, 1)),
928ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                    pickle.loads(pickle.dumps(od, 2)),
929ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                    pickle.loads(pickle.dumps(od, -1)),
930ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                    eval(repr(od)),
931ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                    update_test,
932ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                    OrderedDict(od),
933ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                    ]):
934ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            self.assertTrue(dup is not od)
935ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            self.assertEqual(dup, od)
936ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            self.assertEqual(list(dup.items()), list(od.items()))
937ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            self.assertEqual(len(dup), len(od))
938ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            self.assertEqual(type(dup), type(od))
939ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
940ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def test_yaml_linkage(self):
941ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        # Verify that __reduce__ is setup in a way that supports PyYAML's dump() feature.
942ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        # In yaml, lists are native but tuples are not.
943ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        pairs = [('c', 1), ('b', 2), ('a', 3), ('d', 4), ('e', 5), ('f', 6)]
944ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        od = OrderedDict(pairs)
945ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        # yaml.dump(od) -->
946ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        # '!!python/object/apply:__main__.OrderedDict\n- - [a, 1]\n  - [b, 2]\n'
947ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertTrue(all(type(pair)==list for pair in od.__reduce__()[1]))
948ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
949ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def test_reduce_not_too_fat(self):
950ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        # do not save instance dictionary if not needed
951ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        pairs = [('c', 1), ('b', 2), ('a', 3), ('d', 4), ('e', 5), ('f', 6)]
952ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        od = OrderedDict(pairs)
953ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(len(od.__reduce__()), 2)
954ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        od.x = 10
955ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(len(od.__reduce__()), 3)
956ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
957ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def test_repr(self):
958ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        od = OrderedDict([('c', 1), ('b', 2), ('a', 3), ('d', 4), ('e', 5), ('f', 6)])
959ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(repr(od),
960ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            "OrderedDict([('c', 1), ('b', 2), ('a', 3), ('d', 4), ('e', 5), ('f', 6)])")
961ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(eval(repr(od)), od)
962ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(repr(OrderedDict()), "OrderedDict()")
963ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
964ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def test_repr_recursive(self):
965ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        # See issue #9826
966ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        od = OrderedDict.fromkeys('abc')
967ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        od['x'] = od
968ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(repr(od),
969ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            "OrderedDict([('a', None), ('b', None), ('c', None), ('x', ...)])")
970ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
971ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def test_setdefault(self):
972ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        pairs = [('c', 1), ('b', 2), ('a', 3), ('d', 4), ('e', 5), ('f', 6)]
973ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        shuffle(pairs)
974ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        od = OrderedDict(pairs)
975ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        pair_order = list(od.items())
976ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(od.setdefault('a', 10), 3)
977ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        # make sure order didn't change
978ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(list(od.items()), pair_order)
979ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(od.setdefault('x', 10), 10)
980ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        # make sure 'x' is added to the end
981ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(list(od.items())[-1], ('x', 10))
982ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
983ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        # make sure setdefault still works when __missing__ is defined
984ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        class Missing(OrderedDict):
985ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            def __missing__(self, key):
986ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                return 0
987ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(Missing().setdefault(5, 9), 9)
988ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
989ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def test_reinsert(self):
990ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        # Given insert a, insert b, delete a, re-insert a,
991ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        # verify that a is now later than b.
992ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        od = OrderedDict()
993ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        od['a'] = 1
994ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        od['b'] = 2
995ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        del od['a']
996ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        od['a'] = 1
997ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(list(od.items()), [('b', 2), ('a', 1)])
998ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
999ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def test_views(self):
1000ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        s = 'the quick brown fox jumped over a lazy dog yesterday before dawn'.split()
1001ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        od = OrderedDict.fromkeys(s)
1002ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(list(od.viewkeys()),  s)
1003ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(list(od.viewvalues()),  [None for k in s])
1004ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(list(od.viewitems()),  [(k, None) for k in s])
1005ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
1006ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def test_override_update(self):
1007ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        # Verify that subclasses can override update() without breaking __init__()
1008ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        class MyOD(OrderedDict):
1009ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            def update(self, *args, **kwds):
1010ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                raise Exception()
1011ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        items = [('a', 1), ('c', 3), ('b', 2)]
1012ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(list(MyOD(items).items()), items)
1013ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
1014ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehclass GeneralMappingTests(mapping_tests.BasicTestMappingProtocol):
1015ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    type2test = OrderedDict
1016ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
1017ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def test_popitem(self):
1018ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        d = self._empty_mapping()
1019ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertRaises(KeyError, d.popitem)
1020ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
1021ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehclass MyOrderedDict(OrderedDict):
1022ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    pass
1023ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
1024ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehclass SubclassMappingTests(mapping_tests.BasicTestMappingProtocol):
1025ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    type2test = MyOrderedDict
1026ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
1027ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def test_popitem(self):
1028ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        d = self._empty_mapping()
1029ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertRaises(KeyError, d.popitem)
1030ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
1031ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehimport collections
1032ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
1033ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehdef test_main(verbose=None):
1034ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    NamedTupleDocs = doctest.DocTestSuite(module=collections)
1035ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    test_classes = [TestNamedTuple, NamedTupleDocs, TestOneTrickPonyABCs,
1036ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                    TestCollectionABCs, TestCounter,
1037ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                    TestOrderedDict, GeneralMappingTests, SubclassMappingTests]
1038ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    test_support.run_unittest(*test_classes)
1039ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    test_support.run_doctest(collections, verbose)
1040ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
1041ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehif __name__ == "__main__":
1042ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    test_main(verbose=True)
1043