mapping_tests.py 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686
  1. # tests common to dict and UserDict
  2. import unittest
  3. import UserDict
  4. import test_support
  5. class BasicTestMappingProtocol(unittest.TestCase):
  6. # This base class can be used to check that an object conforms to the
  7. # mapping protocol
  8. # Functions that can be useful to override to adapt to dictionary
  9. # semantics
  10. type2test = None # which class is being tested (overwrite in subclasses)
  11. def _reference(self):
  12. """Return a dictionary of values which are invariant by storage
  13. in the object under test."""
  14. return {1:2, "key1":"value1", "key2":(1,2,3)}
  15. def _empty_mapping(self):
  16. """Return an empty mapping object"""
  17. return self.type2test()
  18. def _full_mapping(self, data):
  19. """Return a mapping object with the value contained in data
  20. dictionary"""
  21. x = self._empty_mapping()
  22. for key, value in data.items():
  23. x[key] = value
  24. return x
  25. def __init__(self, *args, **kw):
  26. unittest.TestCase.__init__(self, *args, **kw)
  27. self.reference = self._reference().copy()
  28. # A (key, value) pair not in the mapping
  29. key, value = self.reference.popitem()
  30. self.other = {key:value}
  31. # A (key, value) pair in the mapping
  32. key, value = self.reference.popitem()
  33. self.inmapping = {key:value}
  34. self.reference[key] = value
  35. def test_read(self):
  36. # Test for read only operations on mapping
  37. p = self._empty_mapping()
  38. p1 = dict(p) #workaround for singleton objects
  39. d = self._full_mapping(self.reference)
  40. if d is p:
  41. p = p1
  42. #Indexing
  43. for key, value in self.reference.items():
  44. self.assertEqual(d[key], value)
  45. knownkey = self.other.keys()[0]
  46. self.assertRaises(KeyError, lambda:d[knownkey])
  47. #len
  48. self.assertEqual(len(p), 0)
  49. self.assertEqual(len(d), len(self.reference))
  50. #in
  51. for k in self.reference:
  52. self.assertIn(k, d)
  53. for k in self.other:
  54. self.assertNotIn(k, d)
  55. #has_key
  56. with test_support.check_py3k_warnings(quiet=True):
  57. for k in self.reference:
  58. self.assertTrue(d.has_key(k))
  59. for k in self.other:
  60. self.assertFalse(d.has_key(k))
  61. #cmp
  62. self.assertEqual(cmp(p,p), 0)
  63. self.assertEqual(cmp(d,d), 0)
  64. self.assertEqual(cmp(p,d), -1)
  65. self.assertEqual(cmp(d,p), 1)
  66. #__non__zero__
  67. if p: self.fail("Empty mapping must compare to False")
  68. if not d: self.fail("Full mapping must compare to True")
  69. # keys(), items(), iterkeys() ...
  70. def check_iterandlist(iter, lst, ref):
  71. self.assertTrue(hasattr(iter, 'next'))
  72. self.assertTrue(hasattr(iter, '__iter__'))
  73. x = list(iter)
  74. self.assertTrue(set(x)==set(lst)==set(ref))
  75. check_iterandlist(d.iterkeys(), d.keys(), self.reference.keys())
  76. check_iterandlist(iter(d), d.keys(), self.reference.keys())
  77. check_iterandlist(d.itervalues(), d.values(), self.reference.values())
  78. check_iterandlist(d.iteritems(), d.items(), self.reference.items())
  79. #get
  80. key, value = d.iteritems().next()
  81. knownkey, knownvalue = self.other.iteritems().next()
  82. self.assertEqual(d.get(key, knownvalue), value)
  83. self.assertEqual(d.get(knownkey, knownvalue), knownvalue)
  84. self.assertNotIn(knownkey, d)
  85. def test_write(self):
  86. # Test for write operations on mapping
  87. p = self._empty_mapping()
  88. #Indexing
  89. for key, value in self.reference.items():
  90. p[key] = value
  91. self.assertEqual(p[key], value)
  92. for key in self.reference.keys():
  93. del p[key]
  94. self.assertRaises(KeyError, lambda:p[key])
  95. p = self._empty_mapping()
  96. #update
  97. p.update(self.reference)
  98. self.assertEqual(dict(p), self.reference)
  99. items = p.items()
  100. p = self._empty_mapping()
  101. p.update(items)
  102. self.assertEqual(dict(p), self.reference)
  103. d = self._full_mapping(self.reference)
  104. #setdefault
  105. key, value = d.iteritems().next()
  106. knownkey, knownvalue = self.other.iteritems().next()
  107. self.assertEqual(d.setdefault(key, knownvalue), value)
  108. self.assertEqual(d[key], value)
  109. self.assertEqual(d.setdefault(knownkey, knownvalue), knownvalue)
  110. self.assertEqual(d[knownkey], knownvalue)
  111. #pop
  112. self.assertEqual(d.pop(knownkey), knownvalue)
  113. self.assertNotIn(knownkey, d)
  114. self.assertRaises(KeyError, d.pop, knownkey)
  115. default = 909
  116. d[knownkey] = knownvalue
  117. self.assertEqual(d.pop(knownkey, default), knownvalue)
  118. self.assertNotIn(knownkey, d)
  119. self.assertEqual(d.pop(knownkey, default), default)
  120. #popitem
  121. key, value = d.popitem()
  122. self.assertNotIn(key, d)
  123. self.assertEqual(value, self.reference[key])
  124. p=self._empty_mapping()
  125. self.assertRaises(KeyError, p.popitem)
  126. def test_constructor(self):
  127. self.assertEqual(self._empty_mapping(), self._empty_mapping())
  128. def test_bool(self):
  129. self.assertTrue(not self._empty_mapping())
  130. self.assertTrue(self.reference)
  131. self.assertTrue(bool(self._empty_mapping()) is False)
  132. self.assertTrue(bool(self.reference) is True)
  133. def test_keys(self):
  134. d = self._empty_mapping()
  135. self.assertEqual(d.keys(), [])
  136. d = self.reference
  137. self.assertIn(self.inmapping.keys()[0], d.keys())
  138. self.assertNotIn(self.other.keys()[0], d.keys())
  139. self.assertRaises(TypeError, d.keys, None)
  140. def test_values(self):
  141. d = self._empty_mapping()
  142. self.assertEqual(d.values(), [])
  143. self.assertRaises(TypeError, d.values, None)
  144. def test_items(self):
  145. d = self._empty_mapping()
  146. self.assertEqual(d.items(), [])
  147. self.assertRaises(TypeError, d.items, None)
  148. def test_len(self):
  149. d = self._empty_mapping()
  150. self.assertEqual(len(d), 0)
  151. def test_getitem(self):
  152. d = self.reference
  153. self.assertEqual(d[self.inmapping.keys()[0]], self.inmapping.values()[0])
  154. self.assertRaises(TypeError, d.__getitem__)
  155. def test_update(self):
  156. # mapping argument
  157. d = self._empty_mapping()
  158. d.update(self.other)
  159. self.assertEqual(d.items(), self.other.items())
  160. # No argument
  161. d = self._empty_mapping()
  162. d.update()
  163. self.assertEqual(d, self._empty_mapping())
  164. # item sequence
  165. d = self._empty_mapping()
  166. d.update(self.other.items())
  167. self.assertEqual(d.items(), self.other.items())
  168. # Iterator
  169. d = self._empty_mapping()
  170. d.update(self.other.iteritems())
  171. self.assertEqual(d.items(), self.other.items())
  172. # FIXME: Doesn't work with UserDict
  173. # self.assertRaises((TypeError, AttributeError), d.update, None)
  174. self.assertRaises((TypeError, AttributeError), d.update, 42)
  175. outerself = self
  176. class SimpleUserDict:
  177. def __init__(self):
  178. self.d = outerself.reference
  179. def keys(self):
  180. return self.d.keys()
  181. def __getitem__(self, i):
  182. return self.d[i]
  183. d.clear()
  184. d.update(SimpleUserDict())
  185. i1 = d.items()
  186. i2 = self.reference.items()
  187. def safe_sort_key(kv):
  188. k, v = kv
  189. return id(type(k)), id(type(v)), k, v
  190. i1.sort(key=safe_sort_key)
  191. i2.sort(key=safe_sort_key)
  192. self.assertEqual(i1, i2)
  193. class Exc(Exception): pass
  194. d = self._empty_mapping()
  195. class FailingUserDict:
  196. def keys(self):
  197. raise Exc
  198. self.assertRaises(Exc, d.update, FailingUserDict())
  199. d.clear()
  200. class FailingUserDict:
  201. def keys(self):
  202. class BogonIter:
  203. def __init__(self):
  204. self.i = 1
  205. def __iter__(self):
  206. return self
  207. def next(self):
  208. if self.i:
  209. self.i = 0
  210. return 'a'
  211. raise Exc
  212. return BogonIter()
  213. def __getitem__(self, key):
  214. return key
  215. self.assertRaises(Exc, d.update, FailingUserDict())
  216. class FailingUserDict:
  217. def keys(self):
  218. class BogonIter:
  219. def __init__(self):
  220. self.i = ord('a')
  221. def __iter__(self):
  222. return self
  223. def next(self):
  224. if self.i <= ord('z'):
  225. rtn = chr(self.i)
  226. self.i += 1
  227. return rtn
  228. raise StopIteration
  229. return BogonIter()
  230. def __getitem__(self, key):
  231. raise Exc
  232. self.assertRaises(Exc, d.update, FailingUserDict())
  233. d = self._empty_mapping()
  234. class badseq(object):
  235. def __iter__(self):
  236. return self
  237. def next(self):
  238. raise Exc()
  239. self.assertRaises(Exc, d.update, badseq())
  240. self.assertRaises(ValueError, d.update, [(1, 2, 3)])
  241. # no test_fromkeys or test_copy as both os.environ and selves don't support it
  242. def test_get(self):
  243. d = self._empty_mapping()
  244. self.assertTrue(d.get(self.other.keys()[0]) is None)
  245. self.assertEqual(d.get(self.other.keys()[0], 3), 3)
  246. d = self.reference
  247. self.assertTrue(d.get(self.other.keys()[0]) is None)
  248. self.assertEqual(d.get(self.other.keys()[0], 3), 3)
  249. self.assertEqual(d.get(self.inmapping.keys()[0]), self.inmapping.values()[0])
  250. self.assertEqual(d.get(self.inmapping.keys()[0], 3), self.inmapping.values()[0])
  251. self.assertRaises(TypeError, d.get)
  252. self.assertRaises(TypeError, d.get, None, None, None)
  253. def test_setdefault(self):
  254. d = self._empty_mapping()
  255. self.assertRaises(TypeError, d.setdefault)
  256. def test_popitem(self):
  257. d = self._empty_mapping()
  258. self.assertRaises(KeyError, d.popitem)
  259. self.assertRaises(TypeError, d.popitem, 42)
  260. def test_pop(self):
  261. d = self._empty_mapping()
  262. k, v = self.inmapping.items()[0]
  263. d[k] = v
  264. self.assertRaises(KeyError, d.pop, self.other.keys()[0])
  265. self.assertEqual(d.pop(k), v)
  266. self.assertEqual(len(d), 0)
  267. self.assertRaises(KeyError, d.pop, k)
  268. class TestMappingProtocol(BasicTestMappingProtocol):
  269. def test_constructor(self):
  270. BasicTestMappingProtocol.test_constructor(self)
  271. self.assertTrue(self._empty_mapping() is not self._empty_mapping())
  272. self.assertEqual(self.type2test(x=1, y=2), {"x": 1, "y": 2})
  273. def test_bool(self):
  274. BasicTestMappingProtocol.test_bool(self)
  275. self.assertTrue(not self._empty_mapping())
  276. self.assertTrue(self._full_mapping({"x": "y"}))
  277. self.assertTrue(bool(self._empty_mapping()) is False)
  278. self.assertTrue(bool(self._full_mapping({"x": "y"})) is True)
  279. def test_keys(self):
  280. BasicTestMappingProtocol.test_keys(self)
  281. d = self._empty_mapping()
  282. self.assertEqual(d.keys(), [])
  283. d = self._full_mapping({'a': 1, 'b': 2})
  284. k = d.keys()
  285. self.assertIn('a', k)
  286. self.assertIn('b', k)
  287. self.assertNotIn('c', k)
  288. def test_values(self):
  289. BasicTestMappingProtocol.test_values(self)
  290. d = self._full_mapping({1:2})
  291. self.assertEqual(d.values(), [2])
  292. def test_items(self):
  293. BasicTestMappingProtocol.test_items(self)
  294. d = self._full_mapping({1:2})
  295. self.assertEqual(d.items(), [(1, 2)])
  296. def test_has_key(self):
  297. d = self._empty_mapping()
  298. self.assertTrue(not d.has_key('a'))
  299. d = self._full_mapping({'a': 1, 'b': 2})
  300. k = d.keys()
  301. k.sort(key=lambda k: (id(type(k)), k))
  302. self.assertEqual(k, ['a', 'b'])
  303. self.assertRaises(TypeError, d.has_key)
  304. def test_contains(self):
  305. d = self._empty_mapping()
  306. self.assertNotIn('a', d)
  307. self.assertTrue(not ('a' in d))
  308. self.assertTrue('a' not in d)
  309. d = self._full_mapping({'a': 1, 'b': 2})
  310. self.assertIn('a', d)
  311. self.assertIn('b', d)
  312. self.assertNotIn('c', d)
  313. self.assertRaises(TypeError, d.__contains__)
  314. def test_len(self):
  315. BasicTestMappingProtocol.test_len(self)
  316. d = self._full_mapping({'a': 1, 'b': 2})
  317. self.assertEqual(len(d), 2)
  318. def test_getitem(self):
  319. BasicTestMappingProtocol.test_getitem(self)
  320. d = self._full_mapping({'a': 1, 'b': 2})
  321. self.assertEqual(d['a'], 1)
  322. self.assertEqual(d['b'], 2)
  323. d['c'] = 3
  324. d['a'] = 4
  325. self.assertEqual(d['c'], 3)
  326. self.assertEqual(d['a'], 4)
  327. del d['b']
  328. self.assertEqual(d, {'a': 4, 'c': 3})
  329. self.assertRaises(TypeError, d.__getitem__)
  330. def test_clear(self):
  331. d = self._full_mapping({1:1, 2:2, 3:3})
  332. d.clear()
  333. self.assertEqual(d, {})
  334. self.assertRaises(TypeError, d.clear, None)
  335. def test_update(self):
  336. BasicTestMappingProtocol.test_update(self)
  337. # mapping argument
  338. d = self._empty_mapping()
  339. d.update({1:100})
  340. d.update({2:20})
  341. d.update({1:1, 2:2, 3:3})
  342. self.assertEqual(d, {1:1, 2:2, 3:3})
  343. # no argument
  344. d.update()
  345. self.assertEqual(d, {1:1, 2:2, 3:3})
  346. # keyword arguments
  347. d = self._empty_mapping()
  348. d.update(x=100)
  349. d.update(y=20)
  350. d.update(x=1, y=2, z=3)
  351. self.assertEqual(d, {"x":1, "y":2, "z":3})
  352. # item sequence
  353. d = self._empty_mapping()
  354. d.update([("x", 100), ("y", 20)])
  355. self.assertEqual(d, {"x":100, "y":20})
  356. # Both item sequence and keyword arguments
  357. d = self._empty_mapping()
  358. d.update([("x", 100), ("y", 20)], x=1, y=2)
  359. self.assertEqual(d, {"x":1, "y":2})
  360. # iterator
  361. d = self._full_mapping({1:3, 2:4})
  362. d.update(self._full_mapping({1:2, 3:4, 5:6}).iteritems())
  363. self.assertEqual(d, {1:2, 2:4, 3:4, 5:6})
  364. class SimpleUserDict:
  365. def __init__(self):
  366. self.d = {1:1, 2:2, 3:3}
  367. def keys(self):
  368. return self.d.keys()
  369. def __getitem__(self, i):
  370. return self.d[i]
  371. d.clear()
  372. d.update(SimpleUserDict())
  373. self.assertEqual(d, {1:1, 2:2, 3:3})
  374. def test_fromkeys(self):
  375. self.assertEqual(self.type2test.fromkeys('abc'), {'a':None, 'b':None, 'c':None})
  376. d = self._empty_mapping()
  377. self.assertTrue(not(d.fromkeys('abc') is d))
  378. self.assertEqual(d.fromkeys('abc'), {'a':None, 'b':None, 'c':None})
  379. self.assertEqual(d.fromkeys((4,5),0), {4:0, 5:0})
  380. self.assertEqual(d.fromkeys([]), {})
  381. def g():
  382. yield 1
  383. self.assertEqual(d.fromkeys(g()), {1:None})
  384. self.assertRaises(TypeError, {}.fromkeys, 3)
  385. class dictlike(self.type2test): pass
  386. self.assertEqual(dictlike.fromkeys('a'), {'a':None})
  387. self.assertEqual(dictlike().fromkeys('a'), {'a':None})
  388. self.assertTrue(dictlike.fromkeys('a').__class__ is dictlike)
  389. self.assertTrue(dictlike().fromkeys('a').__class__ is dictlike)
  390. # FIXME: the following won't work with UserDict, because it's an old style class
  391. # self.assertTrue(type(dictlike.fromkeys('a')) is dictlike)
  392. class mydict(self.type2test):
  393. def __new__(cls):
  394. return UserDict.UserDict()
  395. ud = mydict.fromkeys('ab')
  396. self.assertEqual(ud, {'a':None, 'b':None})
  397. # FIXME: the following won't work with UserDict, because it's an old style class
  398. # self.assertIsInstance(ud, UserDict.UserDict)
  399. self.assertRaises(TypeError, dict.fromkeys)
  400. class Exc(Exception): pass
  401. class baddict1(self.type2test):
  402. def __init__(self):
  403. raise Exc()
  404. self.assertRaises(Exc, baddict1.fromkeys, [1])
  405. class BadSeq(object):
  406. def __iter__(self):
  407. return self
  408. def next(self):
  409. raise Exc()
  410. self.assertRaises(Exc, self.type2test.fromkeys, BadSeq())
  411. class baddict2(self.type2test):
  412. def __setitem__(self, key, value):
  413. raise Exc()
  414. self.assertRaises(Exc, baddict2.fromkeys, [1])
  415. def test_copy(self):
  416. d = self._full_mapping({1:1, 2:2, 3:3})
  417. self.assertEqual(d.copy(), {1:1, 2:2, 3:3})
  418. d = self._empty_mapping()
  419. self.assertEqual(d.copy(), d)
  420. self.assertIsInstance(d.copy(), d.__class__)
  421. self.assertRaises(TypeError, d.copy, None)
  422. def test_get(self):
  423. BasicTestMappingProtocol.test_get(self)
  424. d = self._empty_mapping()
  425. self.assertTrue(d.get('c') is None)
  426. self.assertEqual(d.get('c', 3), 3)
  427. d = self._full_mapping({'a' : 1, 'b' : 2})
  428. self.assertTrue(d.get('c') is None)
  429. self.assertEqual(d.get('c', 3), 3)
  430. self.assertEqual(d.get('a'), 1)
  431. self.assertEqual(d.get('a', 3), 1)
  432. def test_setdefault(self):
  433. BasicTestMappingProtocol.test_setdefault(self)
  434. d = self._empty_mapping()
  435. self.assertTrue(d.setdefault('key0') is None)
  436. d.setdefault('key0', [])
  437. self.assertTrue(d.setdefault('key0') is None)
  438. d.setdefault('key', []).append(3)
  439. self.assertEqual(d['key'][0], 3)
  440. d.setdefault('key', []).append(4)
  441. self.assertEqual(len(d['key']), 2)
  442. def test_popitem(self):
  443. BasicTestMappingProtocol.test_popitem(self)
  444. for copymode in -1, +1:
  445. # -1: b has same structure as a
  446. # +1: b is a.copy()
  447. for log2size in range(12):
  448. size = 2**log2size
  449. a = self._empty_mapping()
  450. b = self._empty_mapping()
  451. for i in range(size):
  452. a[repr(i)] = i
  453. if copymode < 0:
  454. b[repr(i)] = i
  455. if copymode > 0:
  456. b = a.copy()
  457. for i in range(size):
  458. ka, va = ta = a.popitem()
  459. self.assertEqual(va, int(ka))
  460. kb, vb = tb = b.popitem()
  461. self.assertEqual(vb, int(kb))
  462. self.assertTrue(not(copymode < 0 and ta != tb))
  463. self.assertTrue(not a)
  464. self.assertTrue(not b)
  465. def test_pop(self):
  466. BasicTestMappingProtocol.test_pop(self)
  467. # Tests for pop with specified key
  468. d = self._empty_mapping()
  469. k, v = 'abc', 'def'
  470. # verify longs/ints get same value when key > 32 bits (for 64-bit archs)
  471. # see SF bug #689659
  472. x = 4503599627370496L
  473. y = 4503599627370496
  474. h = self._full_mapping({x: 'anything', y: 'something else'})
  475. self.assertEqual(h[x], h[y])
  476. self.assertEqual(d.pop(k, v), v)
  477. d[k] = v
  478. self.assertEqual(d.pop(k, 1), v)
  479. class TestHashMappingProtocol(TestMappingProtocol):
  480. def test_getitem(self):
  481. TestMappingProtocol.test_getitem(self)
  482. class Exc(Exception): pass
  483. class BadEq(object):
  484. def __eq__(self, other):
  485. raise Exc()
  486. def __hash__(self):
  487. return 24
  488. d = self._empty_mapping()
  489. d[BadEq()] = 42
  490. self.assertRaises(KeyError, d.__getitem__, 23)
  491. class BadHash(object):
  492. fail = False
  493. def __hash__(self):
  494. if self.fail:
  495. raise Exc()
  496. else:
  497. return 42
  498. d = self._empty_mapping()
  499. x = BadHash()
  500. d[x] = 42
  501. x.fail = True
  502. self.assertRaises(Exc, d.__getitem__, x)
  503. def test_fromkeys(self):
  504. TestMappingProtocol.test_fromkeys(self)
  505. class mydict(self.type2test):
  506. def __new__(cls):
  507. return UserDict.UserDict()
  508. ud = mydict.fromkeys('ab')
  509. self.assertEqual(ud, {'a':None, 'b':None})
  510. self.assertIsInstance(ud, UserDict.UserDict)
  511. def test_pop(self):
  512. TestMappingProtocol.test_pop(self)
  513. class Exc(Exception): pass
  514. class BadHash(object):
  515. fail = False
  516. def __hash__(self):
  517. if self.fail:
  518. raise Exc()
  519. else:
  520. return 42
  521. d = self._empty_mapping()
  522. x = BadHash()
  523. d[x] = 42
  524. x.fail = True
  525. self.assertRaises(Exc, d.pop, x)
  526. def test_mutatingiteration(self):
  527. d = self._empty_mapping()
  528. d[1] = 1
  529. try:
  530. for i in d:
  531. d[i+1] = 1
  532. except RuntimeError:
  533. pass
  534. else:
  535. self.fail("changing dict size during iteration doesn't raise Error")
  536. def test_repr(self):
  537. d = self._empty_mapping()
  538. self.assertEqual(repr(d), '{}')
  539. d[1] = 2
  540. self.assertEqual(repr(d), '{1: 2}')
  541. d = self._empty_mapping()
  542. d[1] = d
  543. self.assertEqual(repr(d), '{1: {...}}')
  544. class Exc(Exception): pass
  545. class BadRepr(object):
  546. def __repr__(self):
  547. raise Exc()
  548. d = self._full_mapping({1: BadRepr()})
  549. self.assertRaises(Exc, repr, d)
  550. def test_le(self):
  551. self.assertTrue(not (self._empty_mapping() < self._empty_mapping()))
  552. self.assertTrue(not (self._full_mapping({1: 2}) < self._full_mapping({1L: 2L})))
  553. class Exc(Exception): pass
  554. class BadCmp(object):
  555. def __eq__(self, other):
  556. raise Exc()
  557. def __hash__(self):
  558. return 42
  559. d1 = self._full_mapping({BadCmp(): 1})
  560. d2 = self._full_mapping({1: 1})
  561. try:
  562. d1 < d2
  563. except Exc:
  564. pass
  565. else:
  566. self.fail("< didn't raise Exc")
  567. def test_setdefault(self):
  568. TestMappingProtocol.test_setdefault(self)
  569. class Exc(Exception): pass
  570. class BadHash(object):
  571. fail = False
  572. def __hash__(self):
  573. if self.fail:
  574. raise Exc()
  575. else:
  576. return 42
  577. d = self._empty_mapping()
  578. x = BadHash()
  579. d[x] = 42
  580. x.fail = True
  581. self.assertRaises(Exc, d.setdefault, x, [])