| 
									
										
										
										
											2008-05-20 21:35:26 +00:00
										 |  |  | from test import support | 
					
						
							| 
									
										
										
										
											2002-08-01 02:23:06 +00:00
										 |  |  | import random | 
					
						
							| 
									
										
										
										
											2005-11-24 21:58:51 +00:00
										 |  |  | import sys | 
					
						
							|  |  |  | import unittest | 
					
						
							| 
									
										
										
										
											2011-07-26 15:13:47 +02:00
										 |  |  | from functools import cmp_to_key | 
					
						
							| 
									
										
										
										
											2002-08-01 02:23:06 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-05-20 21:35:26 +00:00
										 |  |  | verbose = support.verbose | 
					
						
							| 
									
										
										
										
											2002-08-01 02:23:06 +00:00
										 |  |  | nerrors = 0 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-01-30 20:15:17 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-08-01 02:23:06 +00:00
										 |  |  | def check(tag, expected, raw, compare=None): | 
					
						
							|  |  |  |     global nerrors | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if verbose: | 
					
						
							| 
									
										
										
										
											2007-02-09 05:37:30 +00:00
										 |  |  |         print("    checking", tag) | 
					
						
							| 
									
										
										
										
											2002-08-01 02:23:06 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     orig = raw[:]   # save input in case of error | 
					
						
							|  |  |  |     if compare: | 
					
						
							| 
									
										
										
										
											2011-07-26 15:13:47 +02:00
										 |  |  |         raw.sort(key=cmp_to_key(compare)) | 
					
						
							| 
									
										
										
										
											2002-08-01 02:23:06 +00:00
										 |  |  |     else: | 
					
						
							|  |  |  |         raw.sort() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if len(expected) != len(raw): | 
					
						
							| 
									
										
										
										
											2007-02-09 05:37:30 +00:00
										 |  |  |         print("error in", tag) | 
					
						
							|  |  |  |         print("length mismatch;", len(expected), len(raw)) | 
					
						
							|  |  |  |         print(expected) | 
					
						
							|  |  |  |         print(orig) | 
					
						
							|  |  |  |         print(raw) | 
					
						
							| 
									
										
										
										
											2002-08-01 02:23:06 +00:00
										 |  |  |         nerrors += 1 | 
					
						
							|  |  |  |         return | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     for i, good in enumerate(expected): | 
					
						
							|  |  |  |         maybe = raw[i] | 
					
						
							|  |  |  |         if good is not maybe: | 
					
						
							| 
									
										
										
										
											2007-02-09 05:37:30 +00:00
										 |  |  |             print("error in", tag) | 
					
						
							|  |  |  |             print("out of order at index", i, good, maybe) | 
					
						
							|  |  |  |             print(expected) | 
					
						
							|  |  |  |             print(orig) | 
					
						
							|  |  |  |             print(raw) | 
					
						
							| 
									
										
										
										
											2002-08-01 02:23:06 +00:00
										 |  |  |             nerrors += 1 | 
					
						
							|  |  |  |             return | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-11-24 21:58:51 +00:00
										 |  |  | class TestBase(unittest.TestCase): | 
					
						
							|  |  |  |     def testStressfully(self): | 
					
						
							|  |  |  |         # Try a variety of sizes at and around powers of 2, and at powers of 10. | 
					
						
							|  |  |  |         sizes = [0] | 
					
						
							|  |  |  |         for power in range(1, 10): | 
					
						
							|  |  |  |             n = 2 ** power | 
					
						
							|  |  |  |             sizes.extend(range(n-1, n+2)) | 
					
						
							|  |  |  |         sizes.extend([10, 100, 1000]) | 
					
						
							| 
									
										
										
										
											2002-08-01 02:23:06 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-11-24 21:58:51 +00:00
										 |  |  |         class Complains(object): | 
					
						
							|  |  |  |             maybe_complain = True | 
					
						
							| 
									
										
										
										
											2002-08-01 02:23:06 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-11-24 21:58:51 +00:00
										 |  |  |             def __init__(self, i): | 
					
						
							|  |  |  |                 self.i = i | 
					
						
							| 
									
										
										
										
											2002-08-01 02:23:06 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-11-24 21:58:51 +00:00
										 |  |  |             def __lt__(self, other): | 
					
						
							|  |  |  |                 if Complains.maybe_complain and random.random() < 0.001: | 
					
						
							|  |  |  |                     if verbose: | 
					
						
							| 
									
										
										
										
											2007-02-09 05:37:30 +00:00
										 |  |  |                         print("        complaining at", self, other) | 
					
						
							| 
									
										
										
										
											2005-11-24 21:58:51 +00:00
										 |  |  |                     raise RuntimeError | 
					
						
							|  |  |  |                 return self.i < other.i | 
					
						
							| 
									
										
										
										
											2002-08-01 02:23:06 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-11-24 21:58:51 +00:00
										 |  |  |             def __repr__(self): | 
					
						
							|  |  |  |                 return "Complains(%d)" % self.i | 
					
						
							| 
									
										
										
										
											2002-08-01 02:23:06 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-11-24 21:58:51 +00:00
										 |  |  |         class Stable(object): | 
					
						
							|  |  |  |             def __init__(self, key, i): | 
					
						
							|  |  |  |                 self.key = key | 
					
						
							|  |  |  |                 self.index = i | 
					
						
							| 
									
										
										
										
											2002-08-01 02:23:06 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-08-24 00:41:19 +00:00
										 |  |  |             def __lt__(self, other): | 
					
						
							|  |  |  |                 return self.key < other.key | 
					
						
							| 
									
										
										
										
											2002-08-01 02:23:06 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-11-24 21:58:51 +00:00
										 |  |  |             def __repr__(self): | 
					
						
							|  |  |  |                 return "Stable(%d, %d)" % (self.key, self.index) | 
					
						
							| 
									
										
										
										
											2002-08-01 02:23:06 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-11-24 21:58:51 +00:00
										 |  |  |         for n in sizes: | 
					
						
							| 
									
										
										
										
											2007-05-07 22:24:25 +00:00
										 |  |  |             x = list(range(n)) | 
					
						
							| 
									
										
										
										
											2005-11-24 21:58:51 +00:00
										 |  |  |             if verbose: | 
					
						
							| 
									
										
										
										
											2007-02-09 05:37:30 +00:00
										 |  |  |                 print("Testing size", n) | 
					
						
							| 
									
										
										
										
											2002-08-01 02:23:06 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-11-24 21:58:51 +00:00
										 |  |  |             s = x[:] | 
					
						
							|  |  |  |             check("identity", x, s) | 
					
						
							| 
									
										
										
										
											2002-08-01 02:23:06 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-11-24 21:58:51 +00:00
										 |  |  |             s = x[:] | 
					
						
							|  |  |  |             s.reverse() | 
					
						
							|  |  |  |             check("reversed", x, s) | 
					
						
							| 
									
										
										
										
											2002-08-01 02:23:06 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-11-24 21:58:51 +00:00
										 |  |  |             s = x[:] | 
					
						
							|  |  |  |             random.shuffle(s) | 
					
						
							|  |  |  |             check("random permutation", x, s) | 
					
						
							| 
									
										
										
										
											2002-08-01 02:23:06 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-11-24 21:58:51 +00:00
										 |  |  |             y = x[:] | 
					
						
							|  |  |  |             y.reverse() | 
					
						
							|  |  |  |             s = x[:] | 
					
						
							| 
									
										
										
										
											2009-01-27 18:17:45 +00:00
										 |  |  |             check("reversed via function", y, s, lambda a, b: (b>a)-(b<a)) | 
					
						
							| 
									
										
										
										
											2002-11-12 22:08:10 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-11-24 21:58:51 +00:00
										 |  |  |             if verbose: | 
					
						
							| 
									
										
										
										
											2007-02-09 05:37:30 +00:00
										 |  |  |                 print("    Checking against an insane comparison function.") | 
					
						
							|  |  |  |                 print("        If the implementation isn't careful, this may segfault.") | 
					
						
							| 
									
										
										
										
											2005-11-24 21:58:51 +00:00
										 |  |  |             s = x[:] | 
					
						
							| 
									
										
										
										
											2011-07-26 15:13:47 +02:00
										 |  |  |             s.sort(key=cmp_to_key(lambda a, b:  int(random.random() * 3) - 1)) | 
					
						
							| 
									
										
										
										
											2005-11-24 21:58:51 +00:00
										 |  |  |             check("an insane function left some permutation", x, s) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-05-04 12:46:28 -07:00
										 |  |  |             if len(x) >= 2: | 
					
						
							|  |  |  |                 def bad_key(x): | 
					
						
							|  |  |  |                     raise RuntimeError | 
					
						
							|  |  |  |                 s = x[:] | 
					
						
							|  |  |  |                 self.assertRaises(RuntimeError, s.sort, key=bad_key) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-11-24 21:58:51 +00:00
										 |  |  |             x = [Complains(i) for i in x] | 
					
						
							|  |  |  |             s = x[:] | 
					
						
							|  |  |  |             random.shuffle(s) | 
					
						
							|  |  |  |             Complains.maybe_complain = True | 
					
						
							|  |  |  |             it_complained = False | 
					
						
							|  |  |  |             try: | 
					
						
							|  |  |  |                 s.sort() | 
					
						
							|  |  |  |             except RuntimeError: | 
					
						
							|  |  |  |                 it_complained = True | 
					
						
							|  |  |  |             if it_complained: | 
					
						
							|  |  |  |                 Complains.maybe_complain = False | 
					
						
							|  |  |  |                 check("exception during sort left some permutation", x, s) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-05-07 22:24:25 +00:00
										 |  |  |             s = [Stable(random.randrange(10), i) for i in range(n)] | 
					
						
							| 
									
										
										
										
											2005-11-24 21:58:51 +00:00
										 |  |  |             augmented = [(e, e.index) for e in s] | 
					
						
							|  |  |  |             augmented.sort()    # forced stable because ties broken by index | 
					
						
							|  |  |  |             x = [e for e, i in augmented] # a stable sort of s | 
					
						
							|  |  |  |             check("stability", x, s) | 
					
						
							| 
									
										
										
										
											2002-11-12 22:08:10 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-10-16 03:41:09 +00:00
										 |  |  | #============================================================================== | 
					
						
							| 
									
										
										
										
											2002-11-12 22:08:10 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-10-16 03:41:09 +00:00
										 |  |  | class TestBugs(unittest.TestCase): | 
					
						
							| 
									
										
										
										
											2003-01-02 20:51:08 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-10-16 03:41:09 +00:00
										 |  |  |     def test_bug453523(self): | 
					
						
							|  |  |  |         # bug 453523 -- list.sort() crasher. | 
					
						
							|  |  |  |         # If this fails, the most likely outcome is a core dump. | 
					
						
							|  |  |  |         # Mutations during a list sort should raise a ValueError. | 
					
						
							| 
									
										
										
										
											2003-01-02 20:51:08 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-10-16 03:41:09 +00:00
										 |  |  |         class C: | 
					
						
							|  |  |  |             def __lt__(self, other): | 
					
						
							|  |  |  |                 if L and random.random() < 0.75: | 
					
						
							|  |  |  |                     L.pop() | 
					
						
							|  |  |  |                 else: | 
					
						
							|  |  |  |                     L.append(3) | 
					
						
							|  |  |  |                 return random.random() < 0.5 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         L = [C() for i in range(50)] | 
					
						
							|  |  |  |         self.assertRaises(ValueError, L.sort) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2004-07-29 12:40:23 +00:00
										 |  |  |     def test_undetected_mutation(self): | 
					
						
							|  |  |  |         # Python 2.4a1 did not always detect mutation | 
					
						
							|  |  |  |         memorywaster = [] | 
					
						
							|  |  |  |         for i in range(20): | 
					
						
							|  |  |  |             def mutating_cmp(x, y): | 
					
						
							|  |  |  |                 L.append(3) | 
					
						
							|  |  |  |                 L.pop() | 
					
						
							| 
									
										
										
										
											2009-01-27 18:17:45 +00:00
										 |  |  |                 return (x > y) - (x < y) | 
					
						
							| 
									
										
										
										
											2004-07-29 12:40:23 +00:00
										 |  |  |             L = [1,2] | 
					
						
							| 
									
										
										
										
											2011-07-26 15:13:47 +02:00
										 |  |  |             self.assertRaises(ValueError, L.sort, key=cmp_to_key(mutating_cmp)) | 
					
						
							| 
									
										
										
										
											2004-07-29 12:40:23 +00:00
										 |  |  |             def mutating_cmp(x, y): | 
					
						
							|  |  |  |                 L.append(3) | 
					
						
							|  |  |  |                 del L[:] | 
					
						
							| 
									
										
										
										
											2009-01-27 18:17:45 +00:00
										 |  |  |                 return (x > y) - (x < y) | 
					
						
							| 
									
										
										
										
											2011-07-26 15:13:47 +02:00
										 |  |  |             self.assertRaises(ValueError, L.sort, key=cmp_to_key(mutating_cmp)) | 
					
						
							| 
									
										
										
										
											2004-07-29 12:40:23 +00:00
										 |  |  |             memorywaster = [memorywaster] | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-10-16 03:41:09 +00:00
										 |  |  | #============================================================================== | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class TestDecorateSortUndecorate(unittest.TestCase): | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def test_decorated(self): | 
					
						
							|  |  |  |         data = 'The quick Brown fox Jumped over The lazy Dog'.split() | 
					
						
							|  |  |  |         copy = data[:] | 
					
						
							|  |  |  |         random.shuffle(data) | 
					
						
							|  |  |  |         data.sort(key=str.lower) | 
					
						
							| 
									
										
										
										
											2009-01-27 18:17:45 +00:00
										 |  |  |         def my_cmp(x, y): | 
					
						
							|  |  |  |             xlower, ylower = x.lower(), y.lower() | 
					
						
							|  |  |  |             return (xlower > ylower) - (xlower < ylower) | 
					
						
							| 
									
										
										
										
											2011-07-26 15:13:47 +02:00
										 |  |  |         copy.sort(key=cmp_to_key(my_cmp)) | 
					
						
							| 
									
										
										
										
											2003-10-16 03:41:09 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def test_baddecorator(self): | 
					
						
							|  |  |  |         data = 'The quick Brown fox Jumped over The lazy Dog'.split() | 
					
						
							| 
									
										
										
										
											2008-01-30 20:15:17 +00:00
										 |  |  |         self.assertRaises(TypeError, data.sort, key=lambda x,y: 0) | 
					
						
							| 
									
										
										
										
											2003-10-16 03:41:09 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def test_stability(self): | 
					
						
							| 
									
										
										
										
											2007-05-07 22:24:25 +00:00
										 |  |  |         data = [(random.randrange(100), i) for i in range(200)] | 
					
						
							| 
									
										
										
										
											2003-10-16 03:41:09 +00:00
										 |  |  |         copy = data[:] | 
					
						
							| 
									
										
										
										
											2007-05-15 18:46:22 +00:00
										 |  |  |         data.sort(key=lambda t: t[0])   # sort on the random first field | 
					
						
							| 
									
										
										
										
											2003-10-16 03:41:09 +00:00
										 |  |  |         copy.sort()                     # sort using both fields | 
					
						
							|  |  |  |         self.assertEqual(data, copy)    # should get the same result | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-11-28 21:43:02 +00:00
										 |  |  |     def test_key_with_exception(self): | 
					
						
							|  |  |  |         # Verify that the wrapper has been removed | 
					
						
							| 
									
										
										
										
											2007-05-07 22:24:25 +00:00
										 |  |  |         data = list(range(-2, 2)) | 
					
						
							| 
									
										
										
										
											2003-11-28 21:43:02 +00:00
										 |  |  |         dup = data[:] | 
					
						
							| 
									
										
										
										
											2008-01-30 20:15:17 +00:00
										 |  |  |         self.assertRaises(ZeroDivisionError, data.sort, key=lambda x: 1/x) | 
					
						
							| 
									
										
										
										
											2003-11-28 21:43:02 +00:00
										 |  |  |         self.assertEqual(data, dup) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-12-04 11:25:46 +00:00
										 |  |  |     def test_key_with_mutation(self): | 
					
						
							| 
									
										
										
										
											2007-05-07 22:24:25 +00:00
										 |  |  |         data = list(range(10)) | 
					
						
							| 
									
										
										
										
											2003-12-04 11:25:46 +00:00
										 |  |  |         def k(x): | 
					
						
							|  |  |  |             del data[:] | 
					
						
							|  |  |  |             data[:] = range(20) | 
					
						
							|  |  |  |             return x | 
					
						
							|  |  |  |         self.assertRaises(ValueError, data.sort, key=k) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def test_key_with_mutating_del(self): | 
					
						
							| 
									
										
										
										
											2007-05-07 22:24:25 +00:00
										 |  |  |         data = list(range(10)) | 
					
						
							| 
									
										
										
										
											2003-12-04 11:25:46 +00:00
										 |  |  |         class SortKiller(object): | 
					
						
							|  |  |  |             def __init__(self, x): | 
					
						
							|  |  |  |                 pass | 
					
						
							|  |  |  |             def __del__(self): | 
					
						
							|  |  |  |                 del data[:] | 
					
						
							|  |  |  |                 data[:] = range(20) | 
					
						
							| 
									
										
										
										
											2006-08-24 00:41:19 +00:00
										 |  |  |             def __lt__(self, other): | 
					
						
							|  |  |  |                 return id(self) < id(other) | 
					
						
							| 
									
										
										
										
											2003-12-04 11:25:46 +00:00
										 |  |  |         self.assertRaises(ValueError, data.sort, key=SortKiller) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def test_key_with_mutating_del_and_exception(self): | 
					
						
							| 
									
										
										
										
											2007-05-07 22:24:25 +00:00
										 |  |  |         data = list(range(10)) | 
					
						
							| 
									
										
										
										
											2003-12-04 11:25:46 +00:00
										 |  |  |         ## dup = data[:] | 
					
						
							|  |  |  |         class SortKiller(object): | 
					
						
							|  |  |  |             def __init__(self, x): | 
					
						
							|  |  |  |                 if x > 2: | 
					
						
							|  |  |  |                     raise RuntimeError | 
					
						
							|  |  |  |             def __del__(self): | 
					
						
							|  |  |  |                 del data[:] | 
					
						
							| 
									
										
										
										
											2007-05-07 22:24:25 +00:00
										 |  |  |                 data[:] = list(range(20)) | 
					
						
							| 
									
										
										
										
											2003-12-04 11:25:46 +00:00
										 |  |  |         self.assertRaises(RuntimeError, data.sort, key=SortKiller) | 
					
						
							|  |  |  |         ## major honking subtlety: we *can't* do: | 
					
						
							|  |  |  |         ## | 
					
						
							|  |  |  |         ## self.assertEqual(data, dup) | 
					
						
							|  |  |  |         ## | 
					
						
							|  |  |  |         ## because there is a reference to a SortKiller in the | 
					
						
							|  |  |  |         ## traceback and by the time it dies we're outside the call to | 
					
						
							|  |  |  |         ## .sort() and so the list protection gimmicks are out of | 
					
						
							|  |  |  |         ## date (this cost some brain cells to figure out...). | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-10-16 03:41:09 +00:00
										 |  |  |     def test_reverse(self): | 
					
						
							| 
									
										
										
										
											2007-05-07 22:24:25 +00:00
										 |  |  |         data = list(range(100)) | 
					
						
							| 
									
										
										
										
											2003-10-16 03:41:09 +00:00
										 |  |  |         random.shuffle(data) | 
					
						
							|  |  |  |         data.sort(reverse=True) | 
					
						
							| 
									
										
										
										
											2007-05-07 22:24:25 +00:00
										 |  |  |         self.assertEqual(data, list(range(99,-1,-1))) | 
					
						
							| 
									
										
										
										
											2003-10-16 03:41:09 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def test_reverse_stability(self): | 
					
						
							| 
									
										
										
										
											2007-05-07 22:24:25 +00:00
										 |  |  |         data = [(random.randrange(100), i) for i in range(200)] | 
					
						
							| 
									
										
										
										
											2003-10-16 03:41:09 +00:00
										 |  |  |         copy1 = data[:] | 
					
						
							|  |  |  |         copy2 = data[:] | 
					
						
							| 
									
										
										
										
											2009-01-27 18:17:45 +00:00
										 |  |  |         def my_cmp(x, y): | 
					
						
							|  |  |  |             x0, y0 = x[0], y[0] | 
					
						
							|  |  |  |             return (x0 > y0) - (x0 < y0) | 
					
						
							|  |  |  |         def my_cmp_reversed(x, y): | 
					
						
							|  |  |  |             x0, y0 = x[0], y[0] | 
					
						
							|  |  |  |             return (y0 > x0) - (y0 < x0) | 
					
						
							| 
									
										
										
										
											2011-07-26 15:13:47 +02:00
										 |  |  |         data.sort(key=cmp_to_key(my_cmp), reverse=True) | 
					
						
							|  |  |  |         copy1.sort(key=cmp_to_key(my_cmp_reversed)) | 
					
						
							| 
									
										
										
										
											2003-10-16 03:41:09 +00:00
										 |  |  |         self.assertEqual(data, copy1) | 
					
						
							|  |  |  |         copy2.sort(key=lambda x: x[0], reverse=True) | 
					
						
							|  |  |  |         self.assertEqual(data, copy2) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #============================================================================== | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def test_main(verbose=None): | 
					
						
							|  |  |  |     test_classes = ( | 
					
						
							| 
									
										
										
										
											2005-11-24 21:58:51 +00:00
										 |  |  |         TestBase, | 
					
						
							| 
									
										
										
										
											2003-10-16 03:41:09 +00:00
										 |  |  |         TestDecorateSortUndecorate, | 
					
						
							|  |  |  |         TestBugs, | 
					
						
							|  |  |  |     ) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-05-20 21:35:26 +00:00
										 |  |  |     support.run_unittest(*test_classes) | 
					
						
							| 
									
										
										
										
											2003-10-16 03:41:09 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     # verify reference counting | 
					
						
							|  |  |  |     if verbose and hasattr(sys, "gettotalrefcount"): | 
					
						
							|  |  |  |         import gc | 
					
						
							|  |  |  |         counts = [None] * 5 | 
					
						
							| 
									
										
										
										
											2007-05-07 22:24:25 +00:00
										 |  |  |         for i in range(len(counts)): | 
					
						
							| 
									
										
										
										
											2008-05-20 21:35:26 +00:00
										 |  |  |             support.run_unittest(*test_classes) | 
					
						
							| 
									
										
										
										
											2003-10-16 03:41:09 +00:00
										 |  |  |             gc.collect() | 
					
						
							|  |  |  |             counts[i] = sys.gettotalrefcount() | 
					
						
							| 
									
										
										
										
											2007-02-09 05:37:30 +00:00
										 |  |  |         print(counts) | 
					
						
							| 
									
										
										
										
											2003-10-16 03:41:09 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | if __name__ == "__main__": | 
					
						
							|  |  |  |     test_main(verbose=True) |