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