14710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 24710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmimport unittest, doctest, operator 34710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmimport inspect 44710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmfrom test import test_support 54710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmfrom collections import namedtuple, Counter, OrderedDict 64710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmfrom test import mapping_tests 74710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmimport pickle, cPickle, copy 84710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmfrom random import randrange, shuffle 94710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmimport keyword 104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmimport re 114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmimport sys 124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmfrom collections import Hashable, Iterable, Iterator 134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmfrom collections import Sized, Container, Callable 144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmfrom collections import Set, MutableSet 154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmfrom collections import Mapping, MutableMapping 164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmfrom collections import Sequence, MutableSequence 174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmTestNT = namedtuple('TestNT', 'x y z') # type used for pickle tests 194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmclass TestNamedTuple(unittest.TestCase): 214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def test_factory(self): 234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Point = namedtuple('Point', 'x y') 244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(Point.__name__, 'Point') 254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(Point.__slots__, ()) 264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(Point.__module__, __name__) 274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(Point.__getitem__, tuple.__getitem__) 284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(Point._fields, ('x', 'y')) 294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertRaises(ValueError, namedtuple, 'abc%', 'efg ghi') # type has non-alpha char 314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertRaises(ValueError, namedtuple, 'class', 'efg ghi') # type has keyword 324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertRaises(ValueError, namedtuple, '9abc', 'efg ghi') # type starts with digit 334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertRaises(ValueError, namedtuple, 'abc', 'efg g%hi') # field with non-alpha char 354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertRaises(ValueError, namedtuple, 'abc', 'abc class') # field has keyword 364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertRaises(ValueError, namedtuple, 'abc', '8efg 9ghi') # field starts with digit 374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertRaises(ValueError, namedtuple, 'abc', '_efg ghi') # field with leading underscore 384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertRaises(ValueError, namedtuple, 'abc', 'efg efg ghi') # duplicate field 394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm namedtuple('Point0', 'x1 y2') # Verify that numbers are allowed in names 414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm namedtuple('_', 'a b c') # Test leading underscores in a typename 424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm nt = namedtuple('nt', u'the quick brown fox') # check unicode input 444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertNotIn("u'", repr(nt._fields)) 454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm nt = namedtuple('nt', (u'the', u'quick')) # check unicode input 464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertNotIn("u'", repr(nt._fields)) 474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertRaises(TypeError, Point._make, [11]) # catch too few args 494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertRaises(TypeError, Point._make, [11, 22, 33]) # catch too many args 504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm @unittest.skipIf(sys.flags.optimize >= 2, 524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "Docstrings are omitted with -O2 and above") 534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def test_factory_doc_attr(self): 544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Point = namedtuple('Point', 'x y') 554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(Point.__doc__, 'Point(x, y)') 564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def test_name_fixer(self): 584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm for spec, renamed in [ 594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm [('efg', 'g%hi'), ('efg', '_1')], # field with non-alpha char 604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm [('abc', 'class'), ('abc', '_1')], # field has keyword 614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm [('8efg', '9ghi'), ('_0', '_1')], # field starts with digit 624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm [('abc', '_efg'), ('abc', '_1')], # field with leading underscore 634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm [('abc', 'efg', 'efg', 'ghi'), ('abc', 'efg', '_2', 'ghi')], # duplicate field 644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm [('abc', '', 'x'), ('abc', '_1', 'x')], # fieldname is a space 654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm ]: 664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(namedtuple('NT', spec, rename=True)._fields, renamed) 674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def test_instance(self): 694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Point = namedtuple('Point', 'x y') 704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm p = Point(11, 22) 714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(p, Point(x=11, y=22)) 724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(p, Point(11, y=22)) 734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(p, Point(y=22, x=11)) 744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(p, Point(*(11, 22))) 754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(p, Point(**dict(x=11, y=22))) 764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertRaises(TypeError, Point, 1) # too few args 774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertRaises(TypeError, Point, 1, 2, 3) # too many args 784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertRaises(TypeError, eval, 'Point(XXX=1, y=2)', locals()) # wrong keyword argument 794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertRaises(TypeError, eval, 'Point(x=1)', locals()) # missing keyword argument 804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(repr(p), 'Point(x=11, y=22)') 814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertNotIn('__dict__', dir(p)) # verify instance has no dict 824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertNotIn('__weakref__', dir(p)) 834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(p, Point._make([11, 22])) # test _make classmethod 844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(p._fields, ('x', 'y')) # test _fields attribute 854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(p._replace(x=1), (1, 22)) # test _replace method 864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(p._asdict(), dict(x=11, y=22)) # test _asdict method 874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm try: 894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm p._replace(x=1, error=2) 904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm except ValueError: 914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm pass 924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else: 934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self._fail('Did not detect an incorrect fieldname') 944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # verify that field string can have commas 964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Point = namedtuple('Point', 'x, y') 974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm p = Point(x=11, y=22) 984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(repr(p), 'Point(x=11, y=22)') 994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 1004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # verify that fieldspec can be a non-string sequence 1014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Point = namedtuple('Point', ('x', 'y')) 1024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm p = Point(x=11, y=22) 1034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(repr(p), 'Point(x=11, y=22)') 1044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 1054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def test_tupleness(self): 1064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Point = namedtuple('Point', 'x y') 1074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm p = Point(11, 22) 1084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 1094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertIsInstance(p, tuple) 1104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(p, (11, 22)) # matches a real tuple 1114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(tuple(p), (11, 22)) # coercable to a real tuple 1124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(list(p), [11, 22]) # coercable to a list 1134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(max(p), 22) # iterable 1144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(max(*p), 22) # star-able 1154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm x, y = p 1164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(p, (x, y)) # unpacks like a tuple 1174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual((p[0], p[1]), (11, 22)) # indexable like a tuple 1184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertRaises(IndexError, p.__getitem__, 3) 1194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 1204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(p.x, x) 1214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(p.y, y) 1224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertRaises(AttributeError, eval, 'p.z', locals()) 1234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 1244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def test_odd_sizes(self): 1254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Zero = namedtuple('Zero', '') 1264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(Zero(), ()) 1274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(Zero._make([]), ()) 1284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(repr(Zero()), 'Zero()') 1294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(Zero()._asdict(), {}) 1304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(Zero()._fields, ()) 1314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 1324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Dot = namedtuple('Dot', 'd') 1334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(Dot(1), (1,)) 1344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(Dot._make([1]), (1,)) 1354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(Dot(1).d, 1) 1364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(repr(Dot(1)), 'Dot(d=1)') 1374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(Dot(1)._asdict(), {'d':1}) 1384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(Dot(1)._replace(d=999), (999,)) 1394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(Dot(1)._fields, ('d',)) 1404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 1414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm n = 5000 1424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm import string, random 1434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm names = list(set(''.join([random.choice(string.ascii_letters) 1444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm for j in range(10)]) for i in range(n))) 1454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm n = len(names) 1464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Big = namedtuple('Big', names) 1474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm b = Big(*range(n)) 1484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(b, tuple(range(n))) 1494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(Big._make(range(n)), tuple(range(n))) 1504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm for pos, name in enumerate(names): 1514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(getattr(b, name), pos) 1524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm repr(b) # make sure repr() doesn't blow-up 1534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm d = b._asdict() 1544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm d_expected = dict(zip(names, range(n))) 1554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(d, d_expected) 1564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm b2 = b._replace(**dict([(names[1], 999),(names[-5], 42)])) 1574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm b2_expected = range(n) 1584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm b2_expected[1] = 999 1594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm b2_expected[-5] = 42 1604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(b2, tuple(b2_expected)) 1614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(b._fields, tuple(names)) 1624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 1634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def test_pickle(self): 1644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm p = TestNT(x=10, y=20, z=30) 1654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm for module in pickle, cPickle: 1664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm loads = getattr(module, 'loads') 1674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm dumps = getattr(module, 'dumps') 1684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm for protocol in -1, 0, 1, 2: 1694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm q = loads(dumps(p, protocol)) 1704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(p, q) 1714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(p._fields, q._fields) 1724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 1734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def test_copy(self): 1744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm p = TestNT(x=10, y=20, z=30) 1754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm for copier in copy.copy, copy.deepcopy: 1764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm q = copier(p) 1774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(p, q) 1784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(p._fields, q._fields) 1794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 1804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def test_name_conflicts(self): 1814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # Some names like "self", "cls", "tuple", "itemgetter", and "property" 1824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # failed when used as field names. Test to make sure these now work. 1834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm T = namedtuple('T', 'itemgetter property self cls tuple') 1844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm t = T(1, 2, 3, 4, 5) 1854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(t, (1,2,3,4,5)) 1864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm newt = t._replace(itemgetter=10, property=20, self=30, cls=40, tuple=50) 1874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(newt, (10,20,30,40,50)) 1884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 1894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # Broader test of all interesting names in a template 1904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm with test_support.captured_stdout() as template: 1914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm T = namedtuple('T', 'x', verbose=True) 1924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm words = set(re.findall('[A-Za-z]+', template.getvalue())) 1934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm words -= set(keyword.kwlist) 1944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm T = namedtuple('T', words) 1954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # test __new__ 1964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm values = tuple(range(len(words))) 1974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm t = T(*values) 1984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(t, values) 1994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm t = T(**dict(zip(T._fields, values))) 2004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(t, values) 2014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # test _make 2024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm t = T._make(values) 2034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(t, values) 2044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # exercise __repr__ 2054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm repr(t) 2064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # test _asdict 2074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(t._asdict(), dict(zip(T._fields, values))) 2084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # test _replace 2094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm t = T._make(values) 2104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm newvalues = tuple(v*10 for v in values) 2114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm newt = t._replace(**dict(zip(T._fields, newvalues))) 2124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(newt, newvalues) 2134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # test _fields 2144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(T._fields, tuple(words)) 2154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # test __getnewargs__ 2164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(t.__getnewargs__(), values) 2174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 2184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmclass ABCTestCase(unittest.TestCase): 2194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 2204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def validate_abstract_methods(self, abc, *names): 2214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm methodstubs = dict.fromkeys(names, lambda s, *args: 0) 2224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 2234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # everything should work will all required methods are present 2244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm C = type('C', (abc,), methodstubs) 2254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm C() 2264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 2274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # instantiation should fail if a required method is missing 2284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm for name in names: 2294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm stubs = methodstubs.copy() 2304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm del stubs[name] 2314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm C = type('C', (abc,), stubs) 2324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertRaises(TypeError, C, name) 2334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 2344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def validate_isinstance(self, abc, name): 2354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm stub = lambda s, *args: 0 2364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 2374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # new-style class 2384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm C = type('C', (object,), {name: stub}) 2394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertIsInstance(C(), abc) 2404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertTrue(issubclass(C, abc)) 2414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # old-style class 2424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm class C: pass 2434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm setattr(C, name, stub) 2444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertIsInstance(C(), abc) 2454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertTrue(issubclass(C, abc)) 2464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 2474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # new-style class 2484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm C = type('C', (object,), {'__hash__': None}) 2494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertNotIsInstance(C(), abc) 2504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertFalse(issubclass(C, abc)) 2514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # old-style class 2524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm class C: pass 2534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertNotIsInstance(C(), abc) 2544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertFalse(issubclass(C, abc)) 2554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 2564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def validate_comparison(self, instance): 2574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm ops = ['lt', 'gt', 'le', 'ge', 'ne', 'or', 'and', 'xor', 'sub'] 2584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm operators = {} 2594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm for op in ops: 2604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm name = '__' + op + '__' 2614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm operators[name] = getattr(operator, name) 2624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 2634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm class Other: 2644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def __init__(self): 2654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.right_side = False 2664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def __eq__(self, other): 2674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.right_side = True 2684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return True 2694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm __lt__ = __eq__ 2704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm __gt__ = __eq__ 2714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm __le__ = __eq__ 2724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm __ge__ = __eq__ 2734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm __ne__ = __eq__ 2744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm __ror__ = __eq__ 2754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm __rand__ = __eq__ 2764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm __rxor__ = __eq__ 2774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm __rsub__ = __eq__ 2784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 2794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm for name, op in operators.items(): 2804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if not hasattr(instance, name): 2814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm continue 2824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm other = Other() 2834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm op(instance, other) 2844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertTrue(other.right_side,'Right side not called for %s.%s' 2854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm % (type(instance), name)) 2864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 2874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmclass TestOneTrickPonyABCs(ABCTestCase): 2884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 2894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def test_Hashable(self): 2904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # Check some non-hashables 2914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm non_samples = [list(), set(), dict()] 2924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm for x in non_samples: 2934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertNotIsInstance(x, Hashable) 2944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertFalse(issubclass(type(x), Hashable), repr(type(x))) 2954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # Check some hashables 2964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm samples = [None, 2974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm int(), float(), complex(), 2984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm str(), 2994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm tuple(), frozenset(), 3004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm int, list, object, type, 3014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm ] 3024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm for x in samples: 3034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertIsInstance(x, Hashable) 3044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertTrue(issubclass(type(x), Hashable), repr(type(x))) 3054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertRaises(TypeError, Hashable) 3064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # Check direct subclassing 3074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm class H(Hashable): 3084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def __hash__(self): 3094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return super(H, self).__hash__() 3104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm __eq__ = Hashable.__eq__ # Silence Py3k warning 3114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(hash(H()), 0) 3124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertFalse(issubclass(int, H)) 3134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.validate_abstract_methods(Hashable, '__hash__') 3144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.validate_isinstance(Hashable, '__hash__') 3154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 3164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def test_Iterable(self): 3174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # Check some non-iterables 3184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm non_samples = [None, 42, 3.14, 1j] 3194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm for x in non_samples: 3204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertNotIsInstance(x, Iterable) 3214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertFalse(issubclass(type(x), Iterable), repr(type(x))) 3224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # Check some iterables 3234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm samples = [str(), 3244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm tuple(), list(), set(), frozenset(), dict(), 3254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm dict().keys(), dict().items(), dict().values(), 3264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm (lambda: (yield))(), 3274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm (x for x in []), 3284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm ] 3294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm for x in samples: 3304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertIsInstance(x, Iterable) 3314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertTrue(issubclass(type(x), Iterable), repr(type(x))) 3324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # Check direct subclassing 3334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm class I(Iterable): 3344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def __iter__(self): 3354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return super(I, self).__iter__() 3364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(list(I()), []) 3374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertFalse(issubclass(str, I)) 3384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.validate_abstract_methods(Iterable, '__iter__') 3394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.validate_isinstance(Iterable, '__iter__') 3404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 3414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def test_Iterator(self): 3424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm non_samples = [None, 42, 3.14, 1j, "".encode('ascii'), "", (), [], 3434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm {}, set()] 3444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm for x in non_samples: 3454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertNotIsInstance(x, Iterator) 3464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertFalse(issubclass(type(x), Iterator), repr(type(x))) 3474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm samples = [iter(str()), 3484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm iter(tuple()), iter(list()), iter(dict()), 3494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm iter(set()), iter(frozenset()), 3504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm iter(dict().keys()), iter(dict().items()), 3514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm iter(dict().values()), 3524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm (lambda: (yield))(), 3534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm (x for x in []), 3544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm ] 3554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm for x in samples: 3564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertIsInstance(x, Iterator) 3574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertTrue(issubclass(type(x), Iterator), repr(type(x))) 3584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.validate_abstract_methods(Iterator, 'next', '__iter__') 3594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 3604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # Issue 10565 3614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm class NextOnly: 3624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def __next__(self): 3634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm yield 1 3644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm raise StopIteration 3654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertNotIsInstance(NextOnly(), Iterator) 3664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm class NextOnlyNew(object): 3674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def __next__(self): 3684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm yield 1 3694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm raise StopIteration 3704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertNotIsInstance(NextOnlyNew(), Iterator) 3714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 3724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def test_Sized(self): 3734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm non_samples = [None, 42, 3.14, 1j, 3744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm (lambda: (yield))(), 3754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm (x for x in []), 3764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm ] 3774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm for x in non_samples: 3784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertNotIsInstance(x, Sized) 3794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertFalse(issubclass(type(x), Sized), repr(type(x))) 3804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm samples = [str(), 3814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm tuple(), list(), set(), frozenset(), dict(), 3824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm dict().keys(), dict().items(), dict().values(), 3834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm ] 3844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm for x in samples: 3854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertIsInstance(x, Sized) 3864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertTrue(issubclass(type(x), Sized), repr(type(x))) 3874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.validate_abstract_methods(Sized, '__len__') 3884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.validate_isinstance(Sized, '__len__') 3894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 3904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def test_Container(self): 3914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm non_samples = [None, 42, 3.14, 1j, 3924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm (lambda: (yield))(), 3934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm (x for x in []), 3944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm ] 3954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm for x in non_samples: 3964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertNotIsInstance(x, Container) 3974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertFalse(issubclass(type(x), Container), repr(type(x))) 3984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm samples = [str(), 3994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm tuple(), list(), set(), frozenset(), dict(), 4004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm dict().keys(), dict().items(), 4014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm ] 4024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm for x in samples: 4034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertIsInstance(x, Container) 4044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertTrue(issubclass(type(x), Container), repr(type(x))) 4054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.validate_abstract_methods(Container, '__contains__') 4064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.validate_isinstance(Container, '__contains__') 4074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 4084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def test_Callable(self): 4094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm non_samples = [None, 42, 3.14, 1j, 4104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "", "".encode('ascii'), (), [], {}, set(), 4114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm (lambda: (yield))(), 4124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm (x for x in []), 4134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm ] 4144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm for x in non_samples: 4154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertNotIsInstance(x, Callable) 4164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertFalse(issubclass(type(x), Callable), repr(type(x))) 4174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm samples = [lambda: None, 4184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm type, int, object, 4194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm len, 4204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm list.append, [].append, 4214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm ] 4224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm for x in samples: 4234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertIsInstance(x, Callable) 4244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertTrue(issubclass(type(x), Callable), repr(type(x))) 4254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.validate_abstract_methods(Callable, '__call__') 4264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.validate_isinstance(Callable, '__call__') 4274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 4284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def test_direct_subclassing(self): 4294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm for B in Hashable, Iterable, Iterator, Sized, Container, Callable: 4304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm class C(B): 4314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm pass 4324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertTrue(issubclass(C, B)) 4334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertFalse(issubclass(int, C)) 4344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 4354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def test_registration(self): 4364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm for B in Hashable, Iterable, Iterator, Sized, Container, Callable: 4374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm class C: 4384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm __metaclass__ = type 4394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm __hash__ = None # Make sure it isn't hashable by default 4404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertFalse(issubclass(C, B), B.__name__) 4414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm B.register(C) 4424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertTrue(issubclass(C, B)) 4434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 4444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmclass WithSet(MutableSet): 4454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 4464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def __init__(self, it=()): 4474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.data = set(it) 4484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 4494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def __len__(self): 4504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return len(self.data) 4514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 4524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def __iter__(self): 4534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return iter(self.data) 4544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 4554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def __contains__(self, item): 4564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return item in self.data 4574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 4584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def add(self, item): 4594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.data.add(item) 4604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 4614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def discard(self, item): 4624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.data.discard(item) 4634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 4644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmclass TestCollectionABCs(ABCTestCase): 4654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 4664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # XXX For now, we only test some virtual inheritance properties. 4674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # We should also test the proper behavior of the collection ABCs 4684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # as real base classes or mix-in classes. 4694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 4704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def test_Set(self): 4714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm for sample in [set, frozenset]: 4724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertIsInstance(sample(), Set) 4734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertTrue(issubclass(sample, Set)) 4744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.validate_abstract_methods(Set, '__contains__', '__iter__', '__len__') 4754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm class MySet(Set): 4764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def __contains__(self, x): 4774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return False 4784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def __len__(self): 4794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return 0 4804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def __iter__(self): 4814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return iter([]) 4824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.validate_comparison(MySet()) 4834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 4844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def test_hash_Set(self): 4854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm class OneTwoThreeSet(Set): 4864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def __init__(self): 4874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.contents = [1, 2, 3] 4884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def __contains__(self, x): 4894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return x in self.contents 4904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def __len__(self): 4914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return len(self.contents) 4924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def __iter__(self): 4934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return iter(self.contents) 4944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def __hash__(self): 4954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return self._hash() 4964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm a, b = OneTwoThreeSet(), OneTwoThreeSet() 4974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertTrue(hash(a) == hash(b)) 4984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 4994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def test_MutableSet(self): 5004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertIsInstance(set(), MutableSet) 5014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertTrue(issubclass(set, MutableSet)) 5024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertNotIsInstance(frozenset(), MutableSet) 5034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertFalse(issubclass(frozenset, MutableSet)) 5044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.validate_abstract_methods(MutableSet, '__contains__', '__iter__', '__len__', 5054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 'add', 'discard') 5064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 5074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def test_issue_5647(self): 5084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # MutableSet.__iand__ mutated the set during iteration 5094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm s = WithSet('abcd') 5104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm s &= WithSet('cdef') # This used to fail 5114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(set(s), set('cd')) 5124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 5134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def test_issue_4920(self): 5144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # MutableSet.pop() method did not work 5154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm class MySet(collections.MutableSet): 5164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm __slots__=['__s'] 5174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def __init__(self,items=None): 5184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if items is None: 5194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm items=[] 5204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.__s=set(items) 5214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def __contains__(self,v): 5224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return v in self.__s 5234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def __iter__(self): 5244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return iter(self.__s) 5254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def __len__(self): 5264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return len(self.__s) 5274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def add(self,v): 5284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm result=v not in self.__s 5294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.__s.add(v) 5304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return result 5314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def discard(self,v): 5324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm result=v in self.__s 5334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.__s.discard(v) 5344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return result 5354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def __repr__(self): 5364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return "MySet(%s)" % repr(list(self)) 5374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm s = MySet([5,43,2,1]) 5384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(s.pop(), 1) 5394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 5404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def test_issue8750(self): 5414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm empty = WithSet() 5424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm full = WithSet(range(10)) 5434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm s = WithSet(full) 5444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm s -= s 5454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(s, empty) 5464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm s = WithSet(full) 5474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm s ^= s 5484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(s, empty) 5494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm s = WithSet(full) 5504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm s &= s 5514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(s, full) 5524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm s |= s 5534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(s, full) 5544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 5554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def test_Mapping(self): 5564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm for sample in [dict]: 5574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertIsInstance(sample(), Mapping) 5584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertTrue(issubclass(sample, Mapping)) 5594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.validate_abstract_methods(Mapping, '__contains__', '__iter__', '__len__', 5604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm '__getitem__') 5614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm class MyMapping(collections.Mapping): 5624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def __len__(self): 5634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return 0 5644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def __getitem__(self, i): 5654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm raise IndexError 5664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def __iter__(self): 5674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return iter(()) 5684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.validate_comparison(MyMapping()) 5694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 5704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def test_MutableMapping(self): 5714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm for sample in [dict]: 5724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertIsInstance(sample(), MutableMapping) 5734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertTrue(issubclass(sample, MutableMapping)) 5744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.validate_abstract_methods(MutableMapping, '__contains__', '__iter__', '__len__', 5754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm '__getitem__', '__setitem__', '__delitem__') 5764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 5774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def test_Sequence(self): 5784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm for sample in [tuple, list, str]: 5794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertIsInstance(sample(), Sequence) 5804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertTrue(issubclass(sample, Sequence)) 5814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertTrue(issubclass(basestring, Sequence)) 5824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertIsInstance(range(10), Sequence) 5834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertTrue(issubclass(xrange, Sequence)) 5844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertTrue(issubclass(str, Sequence)) 5854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.validate_abstract_methods(Sequence, '__contains__', '__iter__', '__len__', 5864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm '__getitem__') 5874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 5884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def test_MutableSequence(self): 5894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm for sample in [tuple, str]: 5904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertNotIsInstance(sample(), MutableSequence) 5914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertFalse(issubclass(sample, MutableSequence)) 5924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm for sample in [list]: 5934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertIsInstance(sample(), MutableSequence) 5944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertTrue(issubclass(sample, MutableSequence)) 5954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertFalse(issubclass(basestring, MutableSequence)) 5964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.validate_abstract_methods(MutableSequence, '__contains__', '__iter__', 5974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm '__len__', '__getitem__', '__setitem__', '__delitem__', 'insert') 5984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 5994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmclass TestCounter(unittest.TestCase): 6004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 6014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def test_basics(self): 6024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm c = Counter('abcaba') 6034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(c, Counter({'a':3 , 'b': 2, 'c': 1})) 6044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(c, Counter(a=3, b=2, c=1)) 6054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertIsInstance(c, dict) 6064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertIsInstance(c, Mapping) 6074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertTrue(issubclass(Counter, dict)) 6084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertTrue(issubclass(Counter, Mapping)) 6094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(len(c), 3) 6104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(sum(c.values()), 6) 6114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(sorted(c.values()), [1, 2, 3]) 6124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(sorted(c.keys()), ['a', 'b', 'c']) 6134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(sorted(c), ['a', 'b', 'c']) 6144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(sorted(c.items()), 6154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm [('a', 3), ('b', 2), ('c', 1)]) 6164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(c['b'], 2) 6174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(c['z'], 0) 6184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm with test_support.check_py3k_warnings(): 6194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(c.has_key('c'), True) 6204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(c.has_key('z'), False) 6214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(c.__contains__('c'), True) 6224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(c.__contains__('z'), False) 6234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(c.get('b', 10), 2) 6244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(c.get('z', 10), 10) 6254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(c, dict(a=3, b=2, c=1)) 6264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(repr(c), "Counter({'a': 3, 'b': 2, 'c': 1})") 6274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(c.most_common(), [('a', 3), ('b', 2), ('c', 1)]) 6284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm for i in range(5): 6294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(c.most_common(i), 6304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm [('a', 3), ('b', 2), ('c', 1)][:i]) 6314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(''.join(sorted(c.elements())), 'aaabbc') 6324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm c['a'] += 1 # increment an existing value 6334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm c['b'] -= 2 # sub existing value to zero 6344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm del c['c'] # remove an entry 6354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm del c['c'] # make sure that del doesn't raise KeyError 6364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm c['d'] -= 2 # sub from a missing value 6374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm c['e'] = -5 # directly assign a missing value 6384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm c['f'] += 4 # add to a missing value 6394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(c, dict(a=4, b=0, d=-2, e=-5, f=4)) 6404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(''.join(sorted(c.elements())), 'aaaaffff') 6414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(c.pop('f'), 4) 6424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertNotIn('f', c) 6434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm for i in range(3): 6444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm elem, cnt = c.popitem() 6454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertNotIn(elem, c) 6464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm c.clear() 6474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(c, {}) 6484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(repr(c), 'Counter()') 6494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertRaises(NotImplementedError, Counter.fromkeys, 'abc') 6504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertRaises(TypeError, hash, c) 6514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm c.update(dict(a=5, b=3)) 6524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm c.update(c=1) 6534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm c.update(Counter('a' * 50 + 'b' * 30)) 6544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm c.update() # test case with no args 6554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm c.__init__('a' * 500 + 'b' * 300) 6564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm c.__init__('cdc') 6574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm c.__init__() 6584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(c, dict(a=555, b=333, c=3, d=1)) 6594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(c.setdefault('d', 5), 1) 6604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(c['d'], 1) 6614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(c.setdefault('e', 5), 5) 6624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(c['e'], 5) 6634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 6644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def test_copying(self): 6654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # Check that counters are copyable, deepcopyable, picklable, and 6664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm #have a repr/eval round-trip 6674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm words = Counter('which witch had which witches wrist watch'.split()) 6684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm update_test = Counter() 6694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm update_test.update(words) 6704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm for i, dup in enumerate([ 6714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm words.copy(), 6724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm copy.copy(words), 6734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm copy.deepcopy(words), 6744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm pickle.loads(pickle.dumps(words, 0)), 6754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm pickle.loads(pickle.dumps(words, 1)), 6764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm pickle.loads(pickle.dumps(words, 2)), 6774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm pickle.loads(pickle.dumps(words, -1)), 6784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm cPickle.loads(cPickle.dumps(words, 0)), 6794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm cPickle.loads(cPickle.dumps(words, 1)), 6804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm cPickle.loads(cPickle.dumps(words, 2)), 6814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm cPickle.loads(cPickle.dumps(words, -1)), 6824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm eval(repr(words)), 6834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm update_test, 6844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Counter(words), 6854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm ]): 6864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm msg = (i, dup, words) 6874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertTrue(dup is not words) 6884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(dup, words) 6894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(len(dup), len(words)) 6904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(type(dup), type(words)) 6914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 6924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def test_copy_subclass(self): 6934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm class MyCounter(Counter): 6944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm pass 6954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm c = MyCounter('slartibartfast') 6964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm d = c.copy() 6974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(d, c) 6984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(len(d), len(c)) 6994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(type(d), type(c)) 7004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 7014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def test_conversions(self): 7024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # Convert to: set, list, dict 7034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm s = 'she sells sea shells by the sea shore' 7044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(sorted(Counter(s).elements()), sorted(s)) 7054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(sorted(Counter(s)), sorted(set(s))) 7064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(dict(Counter(s)), dict(Counter(s).items())) 7074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(set(Counter(s)), set(s)) 7084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 7094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def test_invariant_for_the_in_operator(self): 7104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm c = Counter(a=10, b=-2, c=0) 7114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm for elem in c: 7124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertTrue(elem in c) 7134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertIn(elem, c) 7144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 7154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def test_multiset_operations(self): 7164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # Verify that adding a zero counter will strip zeros and negatives 7174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm c = Counter(a=10, b=-2, c=0) + Counter() 7184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(dict(c), dict(a=10)) 7194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 7204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm elements = 'abcd' 7214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm for i in range(1000): 7224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # test random pairs of multisets 7234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm p = Counter(dict((elem, randrange(-2,4)) for elem in elements)) 7244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm p.update(e=1, f=-1, g=0) 7254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm q = Counter(dict((elem, randrange(-2,4)) for elem in elements)) 7264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm q.update(h=1, i=-1, j=0) 7274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm for counterop, numberop in [ 7284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm (Counter.__add__, lambda x, y: max(0, x+y)), 7294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm (Counter.__sub__, lambda x, y: max(0, x-y)), 7304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm (Counter.__or__, lambda x, y: max(0,x,y)), 7314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm (Counter.__and__, lambda x, y: max(0, min(x,y))), 7324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm ]: 7334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm result = counterop(p, q) 7344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm for x in elements: 7354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(numberop(p[x], q[x]), result[x], 7364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm (counterop, x, p, q)) 7374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # verify that results exclude non-positive counts 7384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertTrue(x>0 for x in result.values()) 7394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 7404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm elements = 'abcdef' 7414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm for i in range(100): 7424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # verify that random multisets with no repeats are exactly like sets 7434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm p = Counter(dict((elem, randrange(0, 2)) for elem in elements)) 7444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm q = Counter(dict((elem, randrange(0, 2)) for elem in elements)) 7454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm for counterop, setop in [ 7464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm (Counter.__sub__, set.__sub__), 7474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm (Counter.__or__, set.__or__), 7484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm (Counter.__and__, set.__and__), 7494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm ]: 7504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm counter_result = counterop(p, q) 7514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm set_result = setop(set(p.elements()), set(q.elements())) 7524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(counter_result, dict.fromkeys(set_result, 1)) 7534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 7544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def test_subtract(self): 7554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm c = Counter(a=-5, b=0, c=5, d=10, e=15,g=40) 7564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm c.subtract(a=1, b=2, c=-3, d=10, e=20, f=30, h=-50) 7574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(c, Counter(a=-6, b=-2, c=8, d=0, e=-5, f=-30, g=40, h=50)) 7584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm c = Counter(a=-5, b=0, c=5, d=10, e=15,g=40) 7594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm c.subtract(Counter(a=1, b=2, c=-3, d=10, e=20, f=30, h=-50)) 7604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(c, Counter(a=-6, b=-2, c=8, d=0, e=-5, f=-30, g=40, h=50)) 7614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm c = Counter('aaabbcd') 7624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm c.subtract('aaaabbcce') 7634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(c, Counter(a=-1, b=0, c=-1, d=1, e=-1)) 7644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 7654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmclass TestOrderedDict(unittest.TestCase): 7664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 7674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def test_init(self): 7684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm with self.assertRaises(TypeError): 7694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm OrderedDict([('a', 1), ('b', 2)], None) # too many args 7704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm pairs = [('a', 1), ('b', 2), ('c', 3), ('d', 4), ('e', 5)] 7714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(sorted(OrderedDict(dict(pairs)).items()), pairs) # dict input 7724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(sorted(OrderedDict(**dict(pairs)).items()), pairs) # kwds input 7734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(list(OrderedDict(pairs).items()), pairs) # pairs input 7744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(list(OrderedDict([('a', 1), ('b', 2), ('c', 9), ('d', 4)], 7754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm c=3, e=5).items()), pairs) # mixed input 7764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 7774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # make sure no positional args conflict with possible kwdargs 7784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(inspect.getargspec(OrderedDict.__dict__['__init__']).args, 7794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm ['self']) 7804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 7814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # Make sure that direct calls to __init__ do not clear previous contents 7824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm d = OrderedDict([('a', 1), ('b', 2), ('c', 3), ('d', 44), ('e', 55)]) 7834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm d.__init__([('e', 5), ('f', 6)], g=7, d=4) 7844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(list(d.items()), 7854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm [('a', 1), ('b', 2), ('c', 3), ('d', 4), ('e', 5), ('f', 6), ('g', 7)]) 7864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 7874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def test_update(self): 7884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm with self.assertRaises(TypeError): 7894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm OrderedDict().update([('a', 1), ('b', 2)], None) # too many args 7904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm pairs = [('a', 1), ('b', 2), ('c', 3), ('d', 4), ('e', 5)] 7914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm od = OrderedDict() 7924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm od.update(dict(pairs)) 7934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(sorted(od.items()), pairs) # dict input 7944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm od = OrderedDict() 7954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm od.update(**dict(pairs)) 7964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(sorted(od.items()), pairs) # kwds input 7974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm od = OrderedDict() 7984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm od.update(pairs) 7994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(list(od.items()), pairs) # pairs input 8004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm od = OrderedDict() 8014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm od.update([('a', 1), ('b', 2), ('c', 9), ('d', 4)], c=3, e=5) 8024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(list(od.items()), pairs) # mixed input 8034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 8044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # Issue 9137: Named argument called 'other' or 'self' 8054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # shouldn't be treated specially. 8064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm od = OrderedDict() 8074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm od.update(self=23) 8084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(list(od.items()), [('self', 23)]) 8094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm od = OrderedDict() 8104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm od.update(other={}) 8114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(list(od.items()), [('other', {})]) 8124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm od = OrderedDict() 8134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm od.update(red=5, blue=6, other=7, self=8) 8144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(sorted(list(od.items())), 8154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm [('blue', 6), ('other', 7), ('red', 5), ('self', 8)]) 8164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 8174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # Make sure that direct calls to update do not clear previous contents 8184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # add that updates items are not moved to the end 8194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm d = OrderedDict([('a', 1), ('b', 2), ('c', 3), ('d', 44), ('e', 55)]) 8204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm d.update([('e', 5), ('f', 6)], g=7, d=4) 8214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(list(d.items()), 8224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm [('a', 1), ('b', 2), ('c', 3), ('d', 4), ('e', 5), ('f', 6), ('g', 7)]) 8234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 8244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def test_abc(self): 8254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertIsInstance(OrderedDict(), MutableMapping) 8264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertTrue(issubclass(OrderedDict, MutableMapping)) 8274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 8284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def test_clear(self): 8294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm pairs = [('c', 1), ('b', 2), ('a', 3), ('d', 4), ('e', 5), ('f', 6)] 8304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm shuffle(pairs) 8314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm od = OrderedDict(pairs) 8324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(len(od), len(pairs)) 8334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm od.clear() 8344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(len(od), 0) 8354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 8364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def test_delitem(self): 8374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm pairs = [('c', 1), ('b', 2), ('a', 3), ('d', 4), ('e', 5), ('f', 6)] 8384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm od = OrderedDict(pairs) 8394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm del od['a'] 8404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertNotIn('a', od) 8414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm with self.assertRaises(KeyError): 8424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm del od['a'] 8434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(list(od.items()), pairs[:2] + pairs[3:]) 8444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 8454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def test_setitem(self): 8464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm od = OrderedDict([('d', 1), ('b', 2), ('c', 3), ('a', 4), ('e', 5)]) 8474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm od['c'] = 10 # existing element 8484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm od['f'] = 20 # new element 8494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(list(od.items()), 8504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm [('d', 1), ('b', 2), ('c', 10), ('a', 4), ('e', 5), ('f', 20)]) 8514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 8524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def test_iterators(self): 8534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm pairs = [('c', 1), ('b', 2), ('a', 3), ('d', 4), ('e', 5), ('f', 6)] 8544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm shuffle(pairs) 8554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm od = OrderedDict(pairs) 8564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(list(od), [t[0] for t in pairs]) 8574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(od.keys()[:], [t[0] for t in pairs]) 8584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(od.values()[:], [t[1] for t in pairs]) 8594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(od.items()[:], pairs) 8604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(list(od.iterkeys()), [t[0] for t in pairs]) 8614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(list(od.itervalues()), [t[1] for t in pairs]) 8624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(list(od.iteritems()), pairs) 8634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(list(reversed(od)), 8644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm [t[0] for t in reversed(pairs)]) 8654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 8664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def test_popitem(self): 8674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm pairs = [('c', 1), ('b', 2), ('a', 3), ('d', 4), ('e', 5), ('f', 6)] 8684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm shuffle(pairs) 8694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm od = OrderedDict(pairs) 8704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm while pairs: 8714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(od.popitem(), pairs.pop()) 8724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm with self.assertRaises(KeyError): 8734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm od.popitem() 8744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(len(od), 0) 8754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 8764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def test_pop(self): 8774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm pairs = [('c', 1), ('b', 2), ('a', 3), ('d', 4), ('e', 5), ('f', 6)] 8784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm shuffle(pairs) 8794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm od = OrderedDict(pairs) 8804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm shuffle(pairs) 8814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm while pairs: 8824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm k, v = pairs.pop() 8834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(od.pop(k), v) 8844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm with self.assertRaises(KeyError): 8854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm od.pop('xyz') 8864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(len(od), 0) 8874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(od.pop(k, 12345), 12345) 8884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 8894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # make sure pop still works when __missing__ is defined 8904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm class Missing(OrderedDict): 8914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def __missing__(self, key): 8924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return 0 8934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm m = Missing(a=1) 8944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(m.pop('b', 5), 5) 8954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(m.pop('a', 6), 1) 8964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(m.pop('a', 6), 6) 8974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm with self.assertRaises(KeyError): 8984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm m.pop('a') 8994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 9004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def test_equality(self): 9014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm pairs = [('c', 1), ('b', 2), ('a', 3), ('d', 4), ('e', 5), ('f', 6)] 9024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm shuffle(pairs) 9034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm od1 = OrderedDict(pairs) 9044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm od2 = OrderedDict(pairs) 9054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(od1, od2) # same order implies equality 9064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm pairs = pairs[2:] + pairs[:2] 9074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm od2 = OrderedDict(pairs) 9084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertNotEqual(od1, od2) # different order implies inequality 9094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # comparison to regular dict is not order sensitive 9104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(od1, dict(od2)) 9114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(dict(od2), od1) 9124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # different length implied inequality 9134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertNotEqual(od1, OrderedDict(pairs[:-1])) 9144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 9154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def test_copying(self): 9164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # Check that ordered dicts are copyable, deepcopyable, picklable, 9174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # and have a repr/eval round-trip 9184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm pairs = [('c', 1), ('b', 2), ('a', 3), ('d', 4), ('e', 5), ('f', 6)] 9194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm od = OrderedDict(pairs) 9204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm update_test = OrderedDict() 9214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm update_test.update(od) 9224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm for i, dup in enumerate([ 9234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm od.copy(), 9244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm copy.copy(od), 9254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm copy.deepcopy(od), 9264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm pickle.loads(pickle.dumps(od, 0)), 9274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm pickle.loads(pickle.dumps(od, 1)), 9284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm pickle.loads(pickle.dumps(od, 2)), 9294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm pickle.loads(pickle.dumps(od, -1)), 9304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm eval(repr(od)), 9314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm update_test, 9324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm OrderedDict(od), 9334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm ]): 9344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertTrue(dup is not od) 9354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(dup, od) 9364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(list(dup.items()), list(od.items())) 9374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(len(dup), len(od)) 9384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(type(dup), type(od)) 9394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 9404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def test_yaml_linkage(self): 9414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # Verify that __reduce__ is setup in a way that supports PyYAML's dump() feature. 9424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # In yaml, lists are native but tuples are not. 9434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm pairs = [('c', 1), ('b', 2), ('a', 3), ('d', 4), ('e', 5), ('f', 6)] 9444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm od = OrderedDict(pairs) 9454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # yaml.dump(od) --> 9464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # '!!python/object/apply:__main__.OrderedDict\n- - [a, 1]\n - [b, 2]\n' 9474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertTrue(all(type(pair)==list for pair in od.__reduce__()[1])) 9484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 9494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def test_reduce_not_too_fat(self): 9504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # do not save instance dictionary if not needed 9514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm pairs = [('c', 1), ('b', 2), ('a', 3), ('d', 4), ('e', 5), ('f', 6)] 9524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm od = OrderedDict(pairs) 9534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(len(od.__reduce__()), 2) 9544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm od.x = 10 9554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(len(od.__reduce__()), 3) 9564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 9574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def test_repr(self): 9584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm od = OrderedDict([('c', 1), ('b', 2), ('a', 3), ('d', 4), ('e', 5), ('f', 6)]) 9594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(repr(od), 9604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "OrderedDict([('c', 1), ('b', 2), ('a', 3), ('d', 4), ('e', 5), ('f', 6)])") 9614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(eval(repr(od)), od) 9624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(repr(OrderedDict()), "OrderedDict()") 9634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 9644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def test_repr_recursive(self): 9654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # See issue #9826 9664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm od = OrderedDict.fromkeys('abc') 9674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm od['x'] = od 9684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(repr(od), 9694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "OrderedDict([('a', None), ('b', None), ('c', None), ('x', ...)])") 9704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 9714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def test_setdefault(self): 9724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm pairs = [('c', 1), ('b', 2), ('a', 3), ('d', 4), ('e', 5), ('f', 6)] 9734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm shuffle(pairs) 9744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm od = OrderedDict(pairs) 9754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm pair_order = list(od.items()) 9764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(od.setdefault('a', 10), 3) 9774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # make sure order didn't change 9784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(list(od.items()), pair_order) 9794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(od.setdefault('x', 10), 10) 9804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # make sure 'x' is added to the end 9814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(list(od.items())[-1], ('x', 10)) 9824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 9834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # make sure setdefault still works when __missing__ is defined 9844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm class Missing(OrderedDict): 9854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def __missing__(self, key): 9864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return 0 9874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(Missing().setdefault(5, 9), 9) 9884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 9894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def test_reinsert(self): 9904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # Given insert a, insert b, delete a, re-insert a, 9914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # verify that a is now later than b. 9924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm od = OrderedDict() 9934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm od['a'] = 1 9944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm od['b'] = 2 9954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm del od['a'] 9964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm od['a'] = 1 9974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(list(od.items()), [('b', 2), ('a', 1)]) 9984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 9994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def test_views(self): 10004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm s = 'the quick brown fox jumped over a lazy dog yesterday before dawn'.split() 10014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm od = OrderedDict.fromkeys(s) 10024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(list(od.viewkeys()), s) 10034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(list(od.viewvalues()), [None for k in s]) 10044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(list(od.viewitems()), [(k, None) for k in s]) 10054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 10064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def test_override_update(self): 10074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # Verify that subclasses can override update() without breaking __init__() 10084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm class MyOD(OrderedDict): 10094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def update(self, *args, **kwds): 10104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm raise Exception() 10114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm items = [('a', 1), ('c', 3), ('b', 2)] 10124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(list(MyOD(items).items()), items) 10134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 10144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmclass GeneralMappingTests(mapping_tests.BasicTestMappingProtocol): 10154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm type2test = OrderedDict 10164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 10174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def test_popitem(self): 10184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm d = self._empty_mapping() 10194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertRaises(KeyError, d.popitem) 10204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 10214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmclass MyOrderedDict(OrderedDict): 10224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm pass 10234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 10244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmclass SubclassMappingTests(mapping_tests.BasicTestMappingProtocol): 10254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm type2test = MyOrderedDict 10264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 10274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def test_popitem(self): 10284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm d = self._empty_mapping() 10294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertRaises(KeyError, d.popitem) 10304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 10314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmimport collections 10324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 10334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmdef test_main(verbose=None): 10344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm NamedTupleDocs = doctest.DocTestSuite(module=collections) 10354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm test_classes = [TestNamedTuple, NamedTupleDocs, TestOneTrickPonyABCs, 10364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm TestCollectionABCs, TestCounter, 10374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm TestOrderedDict, GeneralMappingTests, SubclassMappingTests] 10384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm test_support.run_unittest(*test_classes) 10394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm test_support.run_doctest(collections, verbose) 10404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 10414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmif __name__ == "__main__": 10424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm test_main(verbose=True) 1043