blob: b599c9da9e3fb135d1167c9fb1d8a8f0ff614cbf [file] [log] [blame]
Guido van Rossum3bead091992-01-27 17:00:37 +00001# Python test set -- part 3, built-in operations.
2
3
4print '3. Operations'
Fred Drake762c1cb2000-08-31 19:48:52 +00005print 'XXX Mostly not yet implemented'
6
7
8print '3.1 Dictionary lookups succeed even if __cmp__() raises an exception'
9
10# SourceForge bug #112558:
11# http://sourceforge.net/bugs/?func=detailbug&bug_id=112558&group_id=5470
12
Fred Drake004d5e62000-10-23 17:22:08 +000013class BadDictKey:
Tim Peters9a828d32001-05-29 21:14:32 +000014 already_printed_raising_error = 0
15
Fred Drake004d5e62000-10-23 17:22:08 +000016 def __hash__(self):
17 return hash(self.__class__)
Fred Drake762c1cb2000-08-31 19:48:52 +000018
Fred Drake004d5e62000-10-23 17:22:08 +000019 def __cmp__(self, other):
20 if isinstance(other, self.__class__):
Tim Peters9a828d32001-05-29 21:14:32 +000021 if not BadDictKey.already_printed_raising_error:
22 # How many times __cmp__ gets called depends on the hash
23 # code and the internals of the dict implementation; we
24 # know it will be called at least once, but that's it.
25 # already_printed_raising_error makes sure the expected-
26 # output file prints the msg at most once.
27 BadDictKey.already_printed_raising_error = 1
28 print "raising error"
Fred Drake004d5e62000-10-23 17:22:08 +000029 raise RuntimeError, "gotcha"
30 return other
Fred Drake762c1cb2000-08-31 19:48:52 +000031
32d = {}
33x1 = BadDictKey()
34x2 = BadDictKey()
35d[x1] = 1
36d[x2] = 2
37print "No exception passed through."
Tim Peters0c6010b2001-05-23 23:33:57 +000038
39# Dict resizing bug, found by Jack Jansen in 2.2 CVS development.
40# This version got an assert failure in debug build, infinite loop in
41# release build. Unfortunately, provoking this kind of stuff requires
42# a mix of inserts and deletes hitting exactly the right hash codes in
43# exactly the right order, and I can't think of a randomized approach
44# that would be *likely* to hit a failing case in reasonable time.
45
46d = {}
47for i in range(5):
48 d[i] = i
49for i in range(5):
50 del d[i]
51for i in range(5, 9): # i==8 was the problem
52 d[i] = i