Mercurial > cpython-lru_cache-weakref
annotate Lib/test/test_sort.py @ 79691:05c8928362ee
Merge __next__ method link fixes with 3.3.
| author | Ezio Melotti <ezio.melotti@gmail.com> |
|---|---|
| date | Fri, 12 Oct 2012 13:46:37 +0300 |
| parents | fefb7d355361 |
| children |
| rev | line source |
|---|---|
|
47201
9c930a32cebb
#2621 rename test.test_support to test.support
Benjamin Peterson <benjamin@python.org>
parents:
45061
diff
changeset
|
1 from test import support |
|
24457
27825d268317
New test for sorting sanity. Note that this will fail in earlier Pythons,
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
2 import random |
|
35937
e6d31cbf2ed3
move test into a unittest.TestCase, no functional changes
Neal Norwitz <nnorwitz@gmail.com>
parents:
32858
diff
changeset
|
3 import sys |
|
e6d31cbf2ed3
move test into a unittest.TestCase, no functional changes
Neal Norwitz <nnorwitz@gmail.com>
parents:
32858
diff
changeset
|
4 import unittest |
|
71550
fefb7d355361
Remove duplicates of cmp_to_key (#12542, reviewed by Raymond Hettinger)
Éric Araujo <merwok@netwok.org>
parents:
69836
diff
changeset
|
5 from functools import cmp_to_key |
|
24457
27825d268317
New test for sorting sanity. Note that this will fail in earlier Pythons,
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
6 |
|
47201
9c930a32cebb
#2621 rename test.test_support to test.support
Benjamin Peterson <benjamin@python.org>
parents:
45061
diff
changeset
|
7 verbose = support.verbose |
|
24457
27825d268317
New test for sorting sanity. Note that this will fail in earlier Pythons,
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
8 nerrors = 0 |
|
27825d268317
New test for sorting sanity. Note that this will fail in earlier Pythons,
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
9 |
|
45061
b9ee31a26f38
Issue #1771: Remove cmp parameter from list.sort() and builtin.sorted().
Raymond Hettinger <python@rcn.com>
parents:
41717
diff
changeset
|
10 |
|
24457
27825d268317
New test for sorting sanity. Note that this will fail in earlier Pythons,
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
11 def check(tag, expected, raw, compare=None): |
|
27825d268317
New test for sorting sanity. Note that this will fail in earlier Pythons,
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
12 global nerrors |
|
27825d268317
New test for sorting sanity. Note that this will fail in earlier Pythons,
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
13 |
|
27825d268317
New test for sorting sanity. Note that this will fail in earlier Pythons,
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
14 if verbose: |
|
40775
4cdf21a0dbbc
Fix most trivially-findable print statements.
Guido van Rossum <guido@python.org>
parents:
39644
diff
changeset
|
15 print(" checking", tag) |
|
24457
27825d268317
New test for sorting sanity. Note that this will fail in earlier Pythons,
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
16 |
|
27825d268317
New test for sorting sanity. Note that this will fail in earlier Pythons,
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
17 orig = raw[:] # save input in case of error |
|
27825d268317
New test for sorting sanity. Note that this will fail in earlier Pythons,
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
18 if compare: |
|
71550
fefb7d355361
Remove duplicates of cmp_to_key (#12542, reviewed by Raymond Hettinger)
Éric Araujo <merwok@netwok.org>
parents:
69836
diff
changeset
|
19 raw.sort(key=cmp_to_key(compare)) |
|
24457
27825d268317
New test for sorting sanity. Note that this will fail in earlier Pythons,
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
20 else: |
|
27825d268317
New test for sorting sanity. Note that this will fail in earlier Pythons,
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
21 raw.sort() |
|
27825d268317
New test for sorting sanity. Note that this will fail in earlier Pythons,
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
22 |
|
27825d268317
New test for sorting sanity. Note that this will fail in earlier Pythons,
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
23 if len(expected) != len(raw): |
|
40775
4cdf21a0dbbc
Fix most trivially-findable print statements.
Guido van Rossum <guido@python.org>
parents:
39644
diff
changeset
|
24 print("error in", tag) |
|
4cdf21a0dbbc
Fix most trivially-findable print statements.
Guido van Rossum <guido@python.org>
parents:
39644
diff
changeset
|
25 print("length mismatch;", len(expected), len(raw)) |
|
4cdf21a0dbbc
Fix most trivially-findable print statements.
Guido van Rossum <guido@python.org>
parents:
39644
diff
changeset
|
26 print(expected) |
|
4cdf21a0dbbc
Fix most trivially-findable print statements.
Guido van Rossum <guido@python.org>
parents:
39644
diff
changeset
|
27 print(orig) |
|
4cdf21a0dbbc
Fix most trivially-findable print statements.
Guido van Rossum <guido@python.org>
parents:
39644
diff
changeset
|
28 print(raw) |
|
24457
27825d268317
New test for sorting sanity. Note that this will fail in earlier Pythons,
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
29 nerrors += 1 |
|
27825d268317
New test for sorting sanity. Note that this will fail in earlier Pythons,
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
30 return |
|
27825d268317
New test for sorting sanity. Note that this will fail in earlier Pythons,
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
31 |
|
27825d268317
New test for sorting sanity. Note that this will fail in earlier Pythons,
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
32 for i, good in enumerate(expected): |
|
27825d268317
New test for sorting sanity. Note that this will fail in earlier Pythons,
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
33 maybe = raw[i] |
|
27825d268317
New test for sorting sanity. Note that this will fail in earlier Pythons,
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
34 if good is not maybe: |
|
40775
4cdf21a0dbbc
Fix most trivially-findable print statements.
Guido van Rossum <guido@python.org>
parents:
39644
diff
changeset
|
35 print("error in", tag) |
|
4cdf21a0dbbc
Fix most trivially-findable print statements.
Guido van Rossum <guido@python.org>
parents:
39644
diff
changeset
|
36 print("out of order at index", i, good, maybe) |
|
4cdf21a0dbbc
Fix most trivially-findable print statements.
Guido van Rossum <guido@python.org>
parents:
39644
diff
changeset
|
37 print(expected) |
|
4cdf21a0dbbc
Fix most trivially-findable print statements.
Guido van Rossum <guido@python.org>
parents:
39644
diff
changeset
|
38 print(orig) |
|
4cdf21a0dbbc
Fix most trivially-findable print statements.
Guido van Rossum <guido@python.org>
parents:
39644
diff
changeset
|
39 print(raw) |
|
24457
27825d268317
New test for sorting sanity. Note that this will fail in earlier Pythons,
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
40 nerrors += 1 |
|
27825d268317
New test for sorting sanity. Note that this will fail in earlier Pythons,
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
41 return |
|
27825d268317
New test for sorting sanity. Note that this will fail in earlier Pythons,
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
42 |
|
35937
e6d31cbf2ed3
move test into a unittest.TestCase, no functional changes
Neal Norwitz <nnorwitz@gmail.com>
parents:
32858
diff
changeset
|
43 class TestBase(unittest.TestCase): |
|
e6d31cbf2ed3
move test into a unittest.TestCase, no functional changes
Neal Norwitz <nnorwitz@gmail.com>
parents:
32858
diff
changeset
|
44 def testStressfully(self): |
|
e6d31cbf2ed3
move test into a unittest.TestCase, no functional changes
Neal Norwitz <nnorwitz@gmail.com>
parents:
32858
diff
changeset
|
45 # Try a variety of sizes at and around powers of 2, and at powers of 10. |
|
e6d31cbf2ed3
move test into a unittest.TestCase, no functional changes
Neal Norwitz <nnorwitz@gmail.com>
parents:
32858
diff
changeset
|
46 sizes = [0] |
|
e6d31cbf2ed3
move test into a unittest.TestCase, no functional changes
Neal Norwitz <nnorwitz@gmail.com>
parents:
32858
diff
changeset
|
47 for power in range(1, 10): |
|
e6d31cbf2ed3
move test into a unittest.TestCase, no functional changes
Neal Norwitz <nnorwitz@gmail.com>
parents:
32858
diff
changeset
|
48 n = 2 ** power |
|
e6d31cbf2ed3
move test into a unittest.TestCase, no functional changes
Neal Norwitz <nnorwitz@gmail.com>
parents:
32858
diff
changeset
|
49 sizes.extend(range(n-1, n+2)) |
|
e6d31cbf2ed3
move test into a unittest.TestCase, no functional changes
Neal Norwitz <nnorwitz@gmail.com>
parents:
32858
diff
changeset
|
50 sizes.extend([10, 100, 1000]) |
|
24457
27825d268317
New test for sorting sanity. Note that this will fail in earlier Pythons,
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
51 |
|
35937
e6d31cbf2ed3
move test into a unittest.TestCase, no functional changes
Neal Norwitz <nnorwitz@gmail.com>
parents:
32858
diff
changeset
|
52 class Complains(object): |
|
e6d31cbf2ed3
move test into a unittest.TestCase, no functional changes
Neal Norwitz <nnorwitz@gmail.com>
parents:
32858
diff
changeset
|
53 maybe_complain = True |
|
24457
27825d268317
New test for sorting sanity. Note that this will fail in earlier Pythons,
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
54 |
|
35937
e6d31cbf2ed3
move test into a unittest.TestCase, no functional changes
Neal Norwitz <nnorwitz@gmail.com>
parents:
32858
diff
changeset
|
55 def __init__(self, i): |
|
e6d31cbf2ed3
move test into a unittest.TestCase, no functional changes
Neal Norwitz <nnorwitz@gmail.com>
parents:
32858
diff
changeset
|
56 self.i = i |
|
24457
27825d268317
New test for sorting sanity. Note that this will fail in earlier Pythons,
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
57 |
|
35937
e6d31cbf2ed3
move test into a unittest.TestCase, no functional changes
Neal Norwitz <nnorwitz@gmail.com>
parents:
32858
diff
changeset
|
58 def __lt__(self, other): |
|
e6d31cbf2ed3
move test into a unittest.TestCase, no functional changes
Neal Norwitz <nnorwitz@gmail.com>
parents:
32858
diff
changeset
|
59 if Complains.maybe_complain and random.random() < 0.001: |
|
e6d31cbf2ed3
move test into a unittest.TestCase, no functional changes
Neal Norwitz <nnorwitz@gmail.com>
parents:
32858
diff
changeset
|
60 if verbose: |
|
40775
4cdf21a0dbbc
Fix most trivially-findable print statements.
Guido van Rossum <guido@python.org>
parents:
39644
diff
changeset
|
61 print(" complaining at", self, other) |
|
35937
e6d31cbf2ed3
move test into a unittest.TestCase, no functional changes
Neal Norwitz <nnorwitz@gmail.com>
parents:
32858
diff
changeset
|
62 raise RuntimeError |
|
e6d31cbf2ed3
move test into a unittest.TestCase, no functional changes
Neal Norwitz <nnorwitz@gmail.com>
parents:
32858
diff
changeset
|
63 return self.i < other.i |
|
24457
27825d268317
New test for sorting sanity. Note that this will fail in earlier Pythons,
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
64 |
|
35937
e6d31cbf2ed3
move test into a unittest.TestCase, no functional changes
Neal Norwitz <nnorwitz@gmail.com>
parents:
32858
diff
changeset
|
65 def __repr__(self): |
|
e6d31cbf2ed3
move test into a unittest.TestCase, no functional changes
Neal Norwitz <nnorwitz@gmail.com>
parents:
32858
diff
changeset
|
66 return "Complains(%d)" % self.i |
|
24457
27825d268317
New test for sorting sanity. Note that this will fail in earlier Pythons,
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
67 |
|
35937
e6d31cbf2ed3
move test into a unittest.TestCase, no functional changes
Neal Norwitz <nnorwitz@gmail.com>
parents:
32858
diff
changeset
|
68 class Stable(object): |
|
e6d31cbf2ed3
move test into a unittest.TestCase, no functional changes
Neal Norwitz <nnorwitz@gmail.com>
parents:
32858
diff
changeset
|
69 def __init__(self, key, i): |
|
e6d31cbf2ed3
move test into a unittest.TestCase, no functional changes
Neal Norwitz <nnorwitz@gmail.com>
parents:
32858
diff
changeset
|
70 self.key = key |
|
e6d31cbf2ed3
move test into a unittest.TestCase, no functional changes
Neal Norwitz <nnorwitz@gmail.com>
parents:
32858
diff
changeset
|
71 self.index = i |
|
e6d31cbf2ed3
move test into a unittest.TestCase, no functional changes
Neal Norwitz <nnorwitz@gmail.com>
parents:
32858
diff
changeset
|
72 |
|
39644
13d5e5f0e993
Restructure comparison dramatically. There is no longer a default
Guido van Rossum <guido@python.org>
parents:
35937
diff
changeset
|
73 def __lt__(self, other): |
|
13d5e5f0e993
Restructure comparison dramatically. There is no longer a default
Guido van Rossum <guido@python.org>
parents:
35937
diff
changeset
|
74 return self.key < other.key |
|
24457
27825d268317
New test for sorting sanity. Note that this will fail in earlier Pythons,
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
75 |
|
35937
e6d31cbf2ed3
move test into a unittest.TestCase, no functional changes
Neal Norwitz <nnorwitz@gmail.com>
parents:
32858
diff
changeset
|
76 def __repr__(self): |
|
e6d31cbf2ed3
move test into a unittest.TestCase, no functional changes
Neal Norwitz <nnorwitz@gmail.com>
parents:
32858
diff
changeset
|
77 return "Stable(%d, %d)" % (self.key, self.index) |
|
24457
27825d268317
New test for sorting sanity. Note that this will fail in earlier Pythons,
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
78 |
|
35937
e6d31cbf2ed3
move test into a unittest.TestCase, no functional changes
Neal Norwitz <nnorwitz@gmail.com>
parents:
32858
diff
changeset
|
79 for n in sizes: |
|
41642
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
40775
diff
changeset
|
80 x = list(range(n)) |
|
35937
e6d31cbf2ed3
move test into a unittest.TestCase, no functional changes
Neal Norwitz <nnorwitz@gmail.com>
parents:
32858
diff
changeset
|
81 if verbose: |
|
40775
4cdf21a0dbbc
Fix most trivially-findable print statements.
Guido van Rossum <guido@python.org>
parents:
39644
diff
changeset
|
82 print("Testing size", n) |
|
24457
27825d268317
New test for sorting sanity. Note that this will fail in earlier Pythons,
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
83 |
|
35937
e6d31cbf2ed3
move test into a unittest.TestCase, no functional changes
Neal Norwitz <nnorwitz@gmail.com>
parents:
32858
diff
changeset
|
84 s = x[:] |
|
e6d31cbf2ed3
move test into a unittest.TestCase, no functional changes
Neal Norwitz <nnorwitz@gmail.com>
parents:
32858
diff
changeset
|
85 check("identity", x, s) |
|
24457
27825d268317
New test for sorting sanity. Note that this will fail in earlier Pythons,
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
86 |
|
35937
e6d31cbf2ed3
move test into a unittest.TestCase, no functional changes
Neal Norwitz <nnorwitz@gmail.com>
parents:
32858
diff
changeset
|
87 s = x[:] |
|
e6d31cbf2ed3
move test into a unittest.TestCase, no functional changes
Neal Norwitz <nnorwitz@gmail.com>
parents:
32858
diff
changeset
|
88 s.reverse() |
|
e6d31cbf2ed3
move test into a unittest.TestCase, no functional changes
Neal Norwitz <nnorwitz@gmail.com>
parents:
32858
diff
changeset
|
89 check("reversed", x, s) |
|
24457
27825d268317
New test for sorting sanity. Note that this will fail in earlier Pythons,
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
90 |
|
35937
e6d31cbf2ed3
move test into a unittest.TestCase, no functional changes
Neal Norwitz <nnorwitz@gmail.com>
parents:
32858
diff
changeset
|
91 s = x[:] |
|
e6d31cbf2ed3
move test into a unittest.TestCase, no functional changes
Neal Norwitz <nnorwitz@gmail.com>
parents:
32858
diff
changeset
|
92 random.shuffle(s) |
|
e6d31cbf2ed3
move test into a unittest.TestCase, no functional changes
Neal Norwitz <nnorwitz@gmail.com>
parents:
32858
diff
changeset
|
93 check("random permutation", x, s) |
|
24457
27825d268317
New test for sorting sanity. Note that this will fail in earlier Pythons,
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
94 |
|
35937
e6d31cbf2ed3
move test into a unittest.TestCase, no functional changes
Neal Norwitz <nnorwitz@gmail.com>
parents:
32858
diff
changeset
|
95 y = x[:] |
|
e6d31cbf2ed3
move test into a unittest.TestCase, no functional changes
Neal Norwitz <nnorwitz@gmail.com>
parents:
32858
diff
changeset
|
96 y.reverse() |
|
e6d31cbf2ed3
move test into a unittest.TestCase, no functional changes
Neal Norwitz <nnorwitz@gmail.com>
parents:
32858
diff
changeset
|
97 s = x[:] |
|
51122
adbd77a90bde
Merged revisions 69025 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
47201
diff
changeset
|
98 check("reversed via function", y, s, lambda a, b: (b>a)-(b<a)) |
|
24457
27825d268317
New test for sorting sanity. Note that this will fail in earlier Pythons,
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
99 |
|
35937
e6d31cbf2ed3
move test into a unittest.TestCase, no functional changes
Neal Norwitz <nnorwitz@gmail.com>
parents:
32858
diff
changeset
|
100 if verbose: |
|
40775
4cdf21a0dbbc
Fix most trivially-findable print statements.
Guido van Rossum <guido@python.org>
parents:
39644
diff
changeset
|
101 print(" Checking against an insane comparison function.") |
|
4cdf21a0dbbc
Fix most trivially-findable print statements.
Guido van Rossum <guido@python.org>
parents:
39644
diff
changeset
|
102 print(" If the implementation isn't careful, this may segfault.") |
|
35937
e6d31cbf2ed3
move test into a unittest.TestCase, no functional changes
Neal Norwitz <nnorwitz@gmail.com>
parents:
32858
diff
changeset
|
103 s = x[:] |
|
71550
fefb7d355361
Remove duplicates of cmp_to_key (#12542, reviewed by Raymond Hettinger)
Éric Araujo <merwok@netwok.org>
parents:
69836
diff
changeset
|
104 s.sort(key=cmp_to_key(lambda a, b: int(random.random() * 3) - 1)) |
|
35937
e6d31cbf2ed3
move test into a unittest.TestCase, no functional changes
Neal Norwitz <nnorwitz@gmail.com>
parents:
32858
diff
changeset
|
105 check("an insane function left some permutation", x, s) |
|
24457
27825d268317
New test for sorting sanity. Note that this will fail in earlier Pythons,
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
106 |
|
69836
52fb7dc721ed
#11335: Fix memory leak after key function failure in sort
Daniel Stutzbach <daniel.stutzbach@google.com>
parents:
51122
diff
changeset
|
107 if len(x) >= 2: |
|
52fb7dc721ed
#11335: Fix memory leak after key function failure in sort
Daniel Stutzbach <daniel.stutzbach@google.com>
parents:
51122
diff
changeset
|
108 def bad_key(x): |
|
52fb7dc721ed
#11335: Fix memory leak after key function failure in sort
Daniel Stutzbach <daniel.stutzbach@google.com>
parents:
51122
diff
changeset
|
109 raise RuntimeError |
|
52fb7dc721ed
#11335: Fix memory leak after key function failure in sort
Daniel Stutzbach <daniel.stutzbach@google.com>
parents:
51122
diff
changeset
|
110 s = x[:] |
|
52fb7dc721ed
#11335: Fix memory leak after key function failure in sort
Daniel Stutzbach <daniel.stutzbach@google.com>
parents:
51122
diff
changeset
|
111 self.assertRaises(RuntimeError, s.sort, key=bad_key) |
|
52fb7dc721ed
#11335: Fix memory leak after key function failure in sort
Daniel Stutzbach <daniel.stutzbach@google.com>
parents:
51122
diff
changeset
|
112 |
|
35937
e6d31cbf2ed3
move test into a unittest.TestCase, no functional changes
Neal Norwitz <nnorwitz@gmail.com>
parents:
32858
diff
changeset
|
113 x = [Complains(i) for i in x] |
|
e6d31cbf2ed3
move test into a unittest.TestCase, no functional changes
Neal Norwitz <nnorwitz@gmail.com>
parents:
32858
diff
changeset
|
114 s = x[:] |
|
e6d31cbf2ed3
move test into a unittest.TestCase, no functional changes
Neal Norwitz <nnorwitz@gmail.com>
parents:
32858
diff
changeset
|
115 random.shuffle(s) |
|
e6d31cbf2ed3
move test into a unittest.TestCase, no functional changes
Neal Norwitz <nnorwitz@gmail.com>
parents:
32858
diff
changeset
|
116 Complains.maybe_complain = True |
|
e6d31cbf2ed3
move test into a unittest.TestCase, no functional changes
Neal Norwitz <nnorwitz@gmail.com>
parents:
32858
diff
changeset
|
117 it_complained = False |
|
e6d31cbf2ed3
move test into a unittest.TestCase, no functional changes
Neal Norwitz <nnorwitz@gmail.com>
parents:
32858
diff
changeset
|
118 try: |
|
e6d31cbf2ed3
move test into a unittest.TestCase, no functional changes
Neal Norwitz <nnorwitz@gmail.com>
parents:
32858
diff
changeset
|
119 s.sort() |
|
e6d31cbf2ed3
move test into a unittest.TestCase, no functional changes
Neal Norwitz <nnorwitz@gmail.com>
parents:
32858
diff
changeset
|
120 except RuntimeError: |
|
e6d31cbf2ed3
move test into a unittest.TestCase, no functional changes
Neal Norwitz <nnorwitz@gmail.com>
parents:
32858
diff
changeset
|
121 it_complained = True |
|
e6d31cbf2ed3
move test into a unittest.TestCase, no functional changes
Neal Norwitz <nnorwitz@gmail.com>
parents:
32858
diff
changeset
|
122 if it_complained: |
|
e6d31cbf2ed3
move test into a unittest.TestCase, no functional changes
Neal Norwitz <nnorwitz@gmail.com>
parents:
32858
diff
changeset
|
123 Complains.maybe_complain = False |
|
e6d31cbf2ed3
move test into a unittest.TestCase, no functional changes
Neal Norwitz <nnorwitz@gmail.com>
parents:
32858
diff
changeset
|
124 check("exception during sort left some permutation", x, s) |
|
24457
27825d268317
New test for sorting sanity. Note that this will fail in earlier Pythons,
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
125 |
|
41642
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
40775
diff
changeset
|
126 s = [Stable(random.randrange(10), i) for i in range(n)] |
|
35937
e6d31cbf2ed3
move test into a unittest.TestCase, no functional changes
Neal Norwitz <nnorwitz@gmail.com>
parents:
32858
diff
changeset
|
127 augmented = [(e, e.index) for e in s] |
|
e6d31cbf2ed3
move test into a unittest.TestCase, no functional changes
Neal Norwitz <nnorwitz@gmail.com>
parents:
32858
diff
changeset
|
128 augmented.sort() # forced stable because ties broken by index |
|
e6d31cbf2ed3
move test into a unittest.TestCase, no functional changes
Neal Norwitz <nnorwitz@gmail.com>
parents:
32858
diff
changeset
|
129 x = [e for e, i in augmented] # a stable sort of s |
|
e6d31cbf2ed3
move test into a unittest.TestCase, no functional changes
Neal Norwitz <nnorwitz@gmail.com>
parents:
32858
diff
changeset
|
130 check("stability", x, s) |
|
30697
1345c23a0591
* list.sort() now supports three keyword arguments: cmp, key, and reverse.
Raymond Hettinger <python@rcn.com>
parents:
27036
diff
changeset
|
131 |
|
1345c23a0591
* list.sort() now supports three keyword arguments: cmp, key, and reverse.
Raymond Hettinger <python@rcn.com>
parents:
27036
diff
changeset
|
132 #============================================================================== |
|
1345c23a0591
* list.sort() now supports three keyword arguments: cmp, key, and reverse.
Raymond Hettinger <python@rcn.com>
parents:
27036
diff
changeset
|
133 |
|
1345c23a0591
* list.sort() now supports three keyword arguments: cmp, key, and reverse.
Raymond Hettinger <python@rcn.com>
parents:
27036
diff
changeset
|
134 class TestBugs(unittest.TestCase): |
|
26161
dd10d97d329a
SF patch 637176: list.sort crasher
Tim Peters <tim.peters@gmail.com>
parents:
24514
diff
changeset
|
135 |
|
30697
1345c23a0591
* list.sort() now supports three keyword arguments: cmp, key, and reverse.
Raymond Hettinger <python@rcn.com>
parents:
27036
diff
changeset
|
136 def test_bug453523(self): |
|
1345c23a0591
* list.sort() now supports three keyword arguments: cmp, key, and reverse.
Raymond Hettinger <python@rcn.com>
parents:
27036
diff
changeset
|
137 # bug 453523 -- list.sort() crasher. |
|
1345c23a0591
* list.sort() now supports three keyword arguments: cmp, key, and reverse.
Raymond Hettinger <python@rcn.com>
parents:
27036
diff
changeset
|
138 # If this fails, the most likely outcome is a core dump. |
|
1345c23a0591
* list.sort() now supports three keyword arguments: cmp, key, and reverse.
Raymond Hettinger <python@rcn.com>
parents:
27036
diff
changeset
|
139 # Mutations during a list sort should raise a ValueError. |
|
1345c23a0591
* list.sort() now supports three keyword arguments: cmp, key, and reverse.
Raymond Hettinger <python@rcn.com>
parents:
27036
diff
changeset
|
140 |
|
1345c23a0591
* list.sort() now supports three keyword arguments: cmp, key, and reverse.
Raymond Hettinger <python@rcn.com>
parents:
27036
diff
changeset
|
141 class C: |
|
1345c23a0591
* list.sort() now supports three keyword arguments: cmp, key, and reverse.
Raymond Hettinger <python@rcn.com>
parents:
27036
diff
changeset
|
142 def __lt__(self, other): |
|
1345c23a0591
* list.sort() now supports three keyword arguments: cmp, key, and reverse.
Raymond Hettinger <python@rcn.com>
parents:
27036
diff
changeset
|
143 if L and random.random() < 0.75: |
|
1345c23a0591
* list.sort() now supports three keyword arguments: cmp, key, and reverse.
Raymond Hettinger <python@rcn.com>
parents:
27036
diff
changeset
|
144 L.pop() |
|
1345c23a0591
* list.sort() now supports three keyword arguments: cmp, key, and reverse.
Raymond Hettinger <python@rcn.com>
parents:
27036
diff
changeset
|
145 else: |
|
1345c23a0591
* list.sort() now supports three keyword arguments: cmp, key, and reverse.
Raymond Hettinger <python@rcn.com>
parents:
27036
diff
changeset
|
146 L.append(3) |
|
1345c23a0591
* list.sort() now supports three keyword arguments: cmp, key, and reverse.
Raymond Hettinger <python@rcn.com>
parents:
27036
diff
changeset
|
147 return random.random() < 0.5 |
|
1345c23a0591
* list.sort() now supports three keyword arguments: cmp, key, and reverse.
Raymond Hettinger <python@rcn.com>
parents:
27036
diff
changeset
|
148 |
|
1345c23a0591
* list.sort() now supports three keyword arguments: cmp, key, and reverse.
Raymond Hettinger <python@rcn.com>
parents:
27036
diff
changeset
|
149 L = [C() for i in range(50)] |
|
1345c23a0591
* list.sort() now supports three keyword arguments: cmp, key, and reverse.
Raymond Hettinger <python@rcn.com>
parents:
27036
diff
changeset
|
150 self.assertRaises(ValueError, L.sort) |
|
26161
dd10d97d329a
SF patch 637176: list.sort crasher
Tim Peters <tim.peters@gmail.com>
parents:
24514
diff
changeset
|
151 |
|
32858
fa0526c30da8
* drop the unreasonable list invariant that ob_item should never come back
Armin Rigo <arigo@tunes.org>
parents:
31389
diff
changeset
|
152 def test_undetected_mutation(self): |
|
fa0526c30da8
* drop the unreasonable list invariant that ob_item should never come back
Armin Rigo <arigo@tunes.org>
parents:
31389
diff
changeset
|
153 # Python 2.4a1 did not always detect mutation |
|
fa0526c30da8
* drop the unreasonable list invariant that ob_item should never come back
Armin Rigo <arigo@tunes.org>
parents:
31389
diff
changeset
|
154 memorywaster = [] |
|
fa0526c30da8
* drop the unreasonable list invariant that ob_item should never come back
Armin Rigo <arigo@tunes.org>
parents:
31389
diff
changeset
|
155 for i in range(20): |
|
fa0526c30da8
* drop the unreasonable list invariant that ob_item should never come back
Armin Rigo <arigo@tunes.org>
parents:
31389
diff
changeset
|
156 def mutating_cmp(x, y): |
|
fa0526c30da8
* drop the unreasonable list invariant that ob_item should never come back
Armin Rigo <arigo@tunes.org>
parents:
31389
diff
changeset
|
157 L.append(3) |
|
fa0526c30da8
* drop the unreasonable list invariant that ob_item should never come back
Armin Rigo <arigo@tunes.org>
parents:
31389
diff
changeset
|
158 L.pop() |
|
51122
adbd77a90bde
Merged revisions 69025 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
47201
diff
changeset
|
159 return (x > y) - (x < y) |
|
32858
fa0526c30da8
* drop the unreasonable list invariant that ob_item should never come back
Armin Rigo <arigo@tunes.org>
parents:
31389
diff
changeset
|
160 L = [1,2] |
|
71550
fefb7d355361
Remove duplicates of cmp_to_key (#12542, reviewed by Raymond Hettinger)
Éric Araujo <merwok@netwok.org>
parents:
69836
diff
changeset
|
161 self.assertRaises(ValueError, L.sort, key=cmp_to_key(mutating_cmp)) |
|
32858
fa0526c30da8
* drop the unreasonable list invariant that ob_item should never come back
Armin Rigo <arigo@tunes.org>
parents:
31389
diff
changeset
|
162 def mutating_cmp(x, y): |
|
fa0526c30da8
* drop the unreasonable list invariant that ob_item should never come back
Armin Rigo <arigo@tunes.org>
parents:
31389
diff
changeset
|
163 L.append(3) |
|
fa0526c30da8
* drop the unreasonable list invariant that ob_item should never come back
Armin Rigo <arigo@tunes.org>
parents:
31389
diff
changeset
|
164 del L[:] |
|
51122
adbd77a90bde
Merged revisions 69025 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
47201
diff
changeset
|
165 return (x > y) - (x < y) |
|
71550
fefb7d355361
Remove duplicates of cmp_to_key (#12542, reviewed by Raymond Hettinger)
Éric Araujo <merwok@netwok.org>
parents:
69836
diff
changeset
|
166 self.assertRaises(ValueError, L.sort, key=cmp_to_key(mutating_cmp)) |
|
32858
fa0526c30da8
* drop the unreasonable list invariant that ob_item should never come back
Armin Rigo <arigo@tunes.org>
parents:
31389
diff
changeset
|
167 memorywaster = [memorywaster] |
|
fa0526c30da8
* drop the unreasonable list invariant that ob_item should never come back
Armin Rigo <arigo@tunes.org>
parents:
31389
diff
changeset
|
168 |
|
30697
1345c23a0591
* list.sort() now supports three keyword arguments: cmp, key, and reverse.
Raymond Hettinger <python@rcn.com>
parents:
27036
diff
changeset
|
169 #============================================================================== |
|
1345c23a0591
* list.sort() now supports three keyword arguments: cmp, key, and reverse.
Raymond Hettinger <python@rcn.com>
parents:
27036
diff
changeset
|
170 |
|
1345c23a0591
* list.sort() now supports three keyword arguments: cmp, key, and reverse.
Raymond Hettinger <python@rcn.com>
parents:
27036
diff
changeset
|
171 class TestDecorateSortUndecorate(unittest.TestCase): |
|
26161
dd10d97d329a
SF patch 637176: list.sort crasher
Tim Peters <tim.peters@gmail.com>
parents:
24514
diff
changeset
|
172 |
|
30697
1345c23a0591
* list.sort() now supports three keyword arguments: cmp, key, and reverse.
Raymond Hettinger <python@rcn.com>
parents:
27036
diff
changeset
|
173 def test_decorated(self): |
|
1345c23a0591
* list.sort() now supports three keyword arguments: cmp, key, and reverse.
Raymond Hettinger <python@rcn.com>
parents:
27036
diff
changeset
|
174 data = 'The quick Brown fox Jumped over The lazy Dog'.split() |
|
1345c23a0591
* list.sort() now supports three keyword arguments: cmp, key, and reverse.
Raymond Hettinger <python@rcn.com>
parents:
27036
diff
changeset
|
175 copy = data[:] |
|
1345c23a0591
* list.sort() now supports three keyword arguments: cmp, key, and reverse.
Raymond Hettinger <python@rcn.com>
parents:
27036
diff
changeset
|
176 random.shuffle(data) |
|
1345c23a0591
* list.sort() now supports three keyword arguments: cmp, key, and reverse.
Raymond Hettinger <python@rcn.com>
parents:
27036
diff
changeset
|
177 data.sort(key=str.lower) |
|
51122
adbd77a90bde
Merged revisions 69025 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
47201
diff
changeset
|
178 def my_cmp(x, y): |
|
adbd77a90bde
Merged revisions 69025 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
47201
diff
changeset
|
179 xlower, ylower = x.lower(), y.lower() |
|
adbd77a90bde
Merged revisions 69025 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
47201
diff
changeset
|
180 return (xlower > ylower) - (xlower < ylower) |
|
71550
fefb7d355361
Remove duplicates of cmp_to_key (#12542, reviewed by Raymond Hettinger)
Éric Araujo <merwok@netwok.org>
parents:
69836
diff
changeset
|
181 copy.sort(key=cmp_to_key(my_cmp)) |
|
30697
1345c23a0591
* list.sort() now supports three keyword arguments: cmp, key, and reverse.
Raymond Hettinger <python@rcn.com>
parents:
27036
diff
changeset
|
182 |
|
1345c23a0591
* list.sort() now supports three keyword arguments: cmp, key, and reverse.
Raymond Hettinger <python@rcn.com>
parents:
27036
diff
changeset
|
183 def test_baddecorator(self): |
|
1345c23a0591
* list.sort() now supports three keyword arguments: cmp, key, and reverse.
Raymond Hettinger <python@rcn.com>
parents:
27036
diff
changeset
|
184 data = 'The quick Brown fox Jumped over The lazy Dog'.split() |
|
45061
b9ee31a26f38
Issue #1771: Remove cmp parameter from list.sort() and builtin.sorted().
Raymond Hettinger <python@rcn.com>
parents:
41717
diff
changeset
|
185 self.assertRaises(TypeError, data.sort, key=lambda x,y: 0) |
|
30697
1345c23a0591
* list.sort() now supports three keyword arguments: cmp, key, and reverse.
Raymond Hettinger <python@rcn.com>
parents:
27036
diff
changeset
|
186 |
|
1345c23a0591
* list.sort() now supports three keyword arguments: cmp, key, and reverse.
Raymond Hettinger <python@rcn.com>
parents:
27036
diff
changeset
|
187 def test_stability(self): |
|
41642
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
40775
diff
changeset
|
188 data = [(random.randrange(100), i) for i in range(200)] |
|
30697
1345c23a0591
* list.sort() now supports three keyword arguments: cmp, key, and reverse.
Raymond Hettinger <python@rcn.com>
parents:
27036
diff
changeset
|
189 copy = data[:] |
|
41717
9ad84070b22d
Merged revisions 55328-55341 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41642
diff
changeset
|
190 data.sort(key=lambda t: t[0]) # sort on the random first field |
|
30697
1345c23a0591
* list.sort() now supports three keyword arguments: cmp, key, and reverse.
Raymond Hettinger <python@rcn.com>
parents:
27036
diff
changeset
|
191 copy.sort() # sort using both fields |
|
1345c23a0591
* list.sort() now supports three keyword arguments: cmp, key, and reverse.
Raymond Hettinger <python@rcn.com>
parents:
27036
diff
changeset
|
192 self.assertEqual(data, copy) # should get the same result |
|
26161
dd10d97d329a
SF patch 637176: list.sort crasher
Tim Peters <tim.peters@gmail.com>
parents:
24514
diff
changeset
|
193 |
|
31041
6f01700c1808
Make sure the list.sort's decorate step unwinds itself before returning
Raymond Hettinger <python@rcn.com>
parents:
30929
diff
changeset
|
194 def test_key_with_exception(self): |
|
6f01700c1808
Make sure the list.sort's decorate step unwinds itself before returning
Raymond Hettinger <python@rcn.com>
parents:
30929
diff
changeset
|
195 # Verify that the wrapper has been removed |
|
41642
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
40775
diff
changeset
|
196 data = list(range(-2, 2)) |
|
31041
6f01700c1808
Make sure the list.sort's decorate step unwinds itself before returning
Raymond Hettinger <python@rcn.com>
parents:
30929
diff
changeset
|
197 dup = data[:] |
|
45061
b9ee31a26f38
Issue #1771: Remove cmp parameter from list.sort() and builtin.sorted().
Raymond Hettinger <python@rcn.com>
parents:
41717
diff
changeset
|
198 self.assertRaises(ZeroDivisionError, data.sort, key=lambda x: 1/x) |
|
31041
6f01700c1808
Make sure the list.sort's decorate step unwinds itself before returning
Raymond Hettinger <python@rcn.com>
parents:
30929
diff
changeset
|
199 self.assertEqual(data, dup) |
|
6f01700c1808
Make sure the list.sort's decorate step unwinds itself before returning
Raymond Hettinger <python@rcn.com>
parents:
30929
diff
changeset
|
200 |
|
31093
f2e7646f7763
Fixes and tests for various "holding pointers when arbitrary Python code
Michael W. Hudson <mwh@python.net>
parents:
31041
diff
changeset
|
201 def test_key_with_mutation(self): |
|
41642
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
40775
diff
changeset
|
202 data = list(range(10)) |
|
31093
f2e7646f7763
Fixes and tests for various "holding pointers when arbitrary Python code
Michael W. Hudson <mwh@python.net>
parents:
31041
diff
changeset
|
203 def k(x): |
|
f2e7646f7763
Fixes and tests for various "holding pointers when arbitrary Python code
Michael W. Hudson <mwh@python.net>
parents:
31041
diff
changeset
|
204 del data[:] |
|
f2e7646f7763
Fixes and tests for various "holding pointers when arbitrary Python code
Michael W. Hudson <mwh@python.net>
parents:
31041
diff
changeset
|
205 data[:] = range(20) |
|
f2e7646f7763
Fixes and tests for various "holding pointers when arbitrary Python code
Michael W. Hudson <mwh@python.net>
parents:
31041
diff
changeset
|
206 return x |
|
f2e7646f7763
Fixes and tests for various "holding pointers when arbitrary Python code
Michael W. Hudson <mwh@python.net>
parents:
31041
diff
changeset
|
207 self.assertRaises(ValueError, data.sort, key=k) |
|
f2e7646f7763
Fixes and tests for various "holding pointers when arbitrary Python code
Michael W. Hudson <mwh@python.net>
parents:
31041
diff
changeset
|
208 |
|
f2e7646f7763
Fixes and tests for various "holding pointers when arbitrary Python code
Michael W. Hudson <mwh@python.net>
parents:
31041
diff
changeset
|
209 def test_key_with_mutating_del(self): |
|
41642
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
40775
diff
changeset
|
210 data = list(range(10)) |
|
31093
f2e7646f7763
Fixes and tests for various "holding pointers when arbitrary Python code
Michael W. Hudson <mwh@python.net>
parents:
31041
diff
changeset
|
211 class SortKiller(object): |
|
f2e7646f7763
Fixes and tests for various "holding pointers when arbitrary Python code
Michael W. Hudson <mwh@python.net>
parents:
31041
diff
changeset
|
212 def __init__(self, x): |
|
f2e7646f7763
Fixes and tests for various "holding pointers when arbitrary Python code
Michael W. Hudson <mwh@python.net>
parents:
31041
diff
changeset
|
213 pass |
|
f2e7646f7763
Fixes and tests for various "holding pointers when arbitrary Python code
Michael W. Hudson <mwh@python.net>
parents:
31041
diff
changeset
|
214 def __del__(self): |
|
f2e7646f7763
Fixes and tests for various "holding pointers when arbitrary Python code
Michael W. Hudson <mwh@python.net>
parents:
31041
diff
changeset
|
215 del data[:] |
|
f2e7646f7763
Fixes and tests for various "holding pointers when arbitrary Python code
Michael W. Hudson <mwh@python.net>
parents:
31041
diff
changeset
|
216 data[:] = range(20) |
|
39644
13d5e5f0e993
Restructure comparison dramatically. There is no longer a default
Guido van Rossum <guido@python.org>
parents:
35937
diff
changeset
|
217 def __lt__(self, other): |
|
13d5e5f0e993
Restructure comparison dramatically. There is no longer a default
Guido van Rossum <guido@python.org>
parents:
35937
diff
changeset
|
218 return id(self) < id(other) |
|
31093
f2e7646f7763
Fixes and tests for various "holding pointers when arbitrary Python code
Michael W. Hudson <mwh@python.net>
parents:
31041
diff
changeset
|
219 self.assertRaises(ValueError, data.sort, key=SortKiller) |
|
f2e7646f7763
Fixes and tests for various "holding pointers when arbitrary Python code
Michael W. Hudson <mwh@python.net>
parents:
31041
diff
changeset
|
220 |
|
f2e7646f7763
Fixes and tests for various "holding pointers when arbitrary Python code
Michael W. Hudson <mwh@python.net>
parents:
31041
diff
changeset
|
221 def test_key_with_mutating_del_and_exception(self): |
|
41642
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
40775
diff
changeset
|
222 data = list(range(10)) |
|
31093
f2e7646f7763
Fixes and tests for various "holding pointers when arbitrary Python code
Michael W. Hudson <mwh@python.net>
parents:
31041
diff
changeset
|
223 ## dup = data[:] |
|
f2e7646f7763
Fixes and tests for various "holding pointers when arbitrary Python code
Michael W. Hudson <mwh@python.net>
parents:
31041
diff
changeset
|
224 class SortKiller(object): |
|
f2e7646f7763
Fixes and tests for various "holding pointers when arbitrary Python code
Michael W. Hudson <mwh@python.net>
parents:
31041
diff
changeset
|
225 def __init__(self, x): |
|
f2e7646f7763
Fixes and tests for various "holding pointers when arbitrary Python code
Michael W. Hudson <mwh@python.net>
parents:
31041
diff
changeset
|
226 if x > 2: |
|
f2e7646f7763
Fixes and tests for various "holding pointers when arbitrary Python code
Michael W. Hudson <mwh@python.net>
parents:
31041
diff
changeset
|
227 raise RuntimeError |
|
f2e7646f7763
Fixes and tests for various "holding pointers when arbitrary Python code
Michael W. Hudson <mwh@python.net>
parents:
31041
diff
changeset
|
228 def __del__(self): |
|
f2e7646f7763
Fixes and tests for various "holding pointers when arbitrary Python code
Michael W. Hudson <mwh@python.net>
parents:
31041
diff
changeset
|
229 del data[:] |
|
41642
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
40775
diff
changeset
|
230 data[:] = list(range(20)) |
|
31093
f2e7646f7763
Fixes and tests for various "holding pointers when arbitrary Python code
Michael W. Hudson <mwh@python.net>
parents:
31041
diff
changeset
|
231 self.assertRaises(RuntimeError, data.sort, key=SortKiller) |
|
f2e7646f7763
Fixes and tests for various "holding pointers when arbitrary Python code
Michael W. Hudson <mwh@python.net>
parents:
31041
diff
changeset
|
232 ## major honking subtlety: we *can't* do: |
|
f2e7646f7763
Fixes and tests for various "holding pointers when arbitrary Python code
Michael W. Hudson <mwh@python.net>
parents:
31041
diff
changeset
|
233 ## |
|
f2e7646f7763
Fixes and tests for various "holding pointers when arbitrary Python code
Michael W. Hudson <mwh@python.net>
parents:
31041
diff
changeset
|
234 ## self.assertEqual(data, dup) |
|
f2e7646f7763
Fixes and tests for various "holding pointers when arbitrary Python code
Michael W. Hudson <mwh@python.net>
parents:
31041
diff
changeset
|
235 ## |
|
f2e7646f7763
Fixes and tests for various "holding pointers when arbitrary Python code
Michael W. Hudson <mwh@python.net>
parents:
31041
diff
changeset
|
236 ## because there is a reference to a SortKiller in the |
|
f2e7646f7763
Fixes and tests for various "holding pointers when arbitrary Python code
Michael W. Hudson <mwh@python.net>
parents:
31041
diff
changeset
|
237 ## traceback and by the time it dies we're outside the call to |
|
f2e7646f7763
Fixes and tests for various "holding pointers when arbitrary Python code
Michael W. Hudson <mwh@python.net>
parents:
31041
diff
changeset
|
238 ## .sort() and so the list protection gimmicks are out of |
|
f2e7646f7763
Fixes and tests for various "holding pointers when arbitrary Python code
Michael W. Hudson <mwh@python.net>
parents:
31041
diff
changeset
|
239 ## date (this cost some brain cells to figure out...). |
|
f2e7646f7763
Fixes and tests for various "holding pointers when arbitrary Python code
Michael W. Hudson <mwh@python.net>
parents:
31041
diff
changeset
|
240 |
|
30697
1345c23a0591
* list.sort() now supports three keyword arguments: cmp, key, and reverse.
Raymond Hettinger <python@rcn.com>
parents:
27036
diff
changeset
|
241 def test_reverse(self): |
|
41642
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
40775
diff
changeset
|
242 data = list(range(100)) |
|
30697
1345c23a0591
* list.sort() now supports three keyword arguments: cmp, key, and reverse.
Raymond Hettinger <python@rcn.com>
parents:
27036
diff
changeset
|
243 random.shuffle(data) |
|
1345c23a0591
* list.sort() now supports three keyword arguments: cmp, key, and reverse.
Raymond Hettinger <python@rcn.com>
parents:
27036
diff
changeset
|
244 data.sort(reverse=True) |
|
41642
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
40775
diff
changeset
|
245 self.assertEqual(data, list(range(99,-1,-1))) |
|
27036
41f7726e3e51
Allow list sort's comparison function to explicitly be None. See SF patch
Skip Montanaro <skip@pobox.com>
parents:
26161
diff
changeset
|
246 |
|
30697
1345c23a0591
* list.sort() now supports three keyword arguments: cmp, key, and reverse.
Raymond Hettinger <python@rcn.com>
parents:
27036
diff
changeset
|
247 def test_reverse_stability(self): |
|
41642
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
40775
diff
changeset
|
248 data = [(random.randrange(100), i) for i in range(200)] |
|
30697
1345c23a0591
* list.sort() now supports three keyword arguments: cmp, key, and reverse.
Raymond Hettinger <python@rcn.com>
parents:
27036
diff
changeset
|
249 copy1 = data[:] |
|
1345c23a0591
* list.sort() now supports three keyword arguments: cmp, key, and reverse.
Raymond Hettinger <python@rcn.com>
parents:
27036
diff
changeset
|
250 copy2 = data[:] |
|
51122
adbd77a90bde
Merged revisions 69025 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
47201
diff
changeset
|
251 def my_cmp(x, y): |
|
adbd77a90bde
Merged revisions 69025 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
47201
diff
changeset
|
252 x0, y0 = x[0], y[0] |
|
adbd77a90bde
Merged revisions 69025 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
47201
diff
changeset
|
253 return (x0 > y0) - (x0 < y0) |
|
adbd77a90bde
Merged revisions 69025 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
47201
diff
changeset
|
254 def my_cmp_reversed(x, y): |
|
adbd77a90bde
Merged revisions 69025 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
47201
diff
changeset
|
255 x0, y0 = x[0], y[0] |
|
adbd77a90bde
Merged revisions 69025 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
47201
diff
changeset
|
256 return (y0 > x0) - (y0 < x0) |
|
71550
fefb7d355361
Remove duplicates of cmp_to_key (#12542, reviewed by Raymond Hettinger)
Éric Araujo <merwok@netwok.org>
parents:
69836
diff
changeset
|
257 data.sort(key=cmp_to_key(my_cmp), reverse=True) |
|
fefb7d355361
Remove duplicates of cmp_to_key (#12542, reviewed by Raymond Hettinger)
Éric Araujo <merwok@netwok.org>
parents:
69836
diff
changeset
|
258 copy1.sort(key=cmp_to_key(my_cmp_reversed)) |
|
30697
1345c23a0591
* list.sort() now supports three keyword arguments: cmp, key, and reverse.
Raymond Hettinger <python@rcn.com>
parents:
27036
diff
changeset
|
259 self.assertEqual(data, copy1) |
|
1345c23a0591
* list.sort() now supports three keyword arguments: cmp, key, and reverse.
Raymond Hettinger <python@rcn.com>
parents:
27036
diff
changeset
|
260 copy2.sort(key=lambda x: x[0], reverse=True) |
|
1345c23a0591
* list.sort() now supports three keyword arguments: cmp, key, and reverse.
Raymond Hettinger <python@rcn.com>
parents:
27036
diff
changeset
|
261 self.assertEqual(data, copy2) |
|
1345c23a0591
* list.sort() now supports three keyword arguments: cmp, key, and reverse.
Raymond Hettinger <python@rcn.com>
parents:
27036
diff
changeset
|
262 |
|
1345c23a0591
* list.sort() now supports three keyword arguments: cmp, key, and reverse.
Raymond Hettinger <python@rcn.com>
parents:
27036
diff
changeset
|
263 #============================================================================== |
|
27036
41f7726e3e51
Allow list sort's comparison function to explicitly be None. See SF patch
Skip Montanaro <skip@pobox.com>
parents:
26161
diff
changeset
|
264 |
|
30697
1345c23a0591
* list.sort() now supports three keyword arguments: cmp, key, and reverse.
Raymond Hettinger <python@rcn.com>
parents:
27036
diff
changeset
|
265 def test_main(verbose=None): |
|
1345c23a0591
* list.sort() now supports three keyword arguments: cmp, key, and reverse.
Raymond Hettinger <python@rcn.com>
parents:
27036
diff
changeset
|
266 test_classes = ( |
|
35937
e6d31cbf2ed3
move test into a unittest.TestCase, no functional changes
Neal Norwitz <nnorwitz@gmail.com>
parents:
32858
diff
changeset
|
267 TestBase, |
|
30697
1345c23a0591
* list.sort() now supports three keyword arguments: cmp, key, and reverse.
Raymond Hettinger <python@rcn.com>
parents:
27036
diff
changeset
|
268 TestDecorateSortUndecorate, |
|
1345c23a0591
* list.sort() now supports three keyword arguments: cmp, key, and reverse.
Raymond Hettinger <python@rcn.com>
parents:
27036
diff
changeset
|
269 TestBugs, |
|
1345c23a0591
* list.sort() now supports three keyword arguments: cmp, key, and reverse.
Raymond Hettinger <python@rcn.com>
parents:
27036
diff
changeset
|
270 ) |
|
1345c23a0591
* list.sort() now supports three keyword arguments: cmp, key, and reverse.
Raymond Hettinger <python@rcn.com>
parents:
27036
diff
changeset
|
271 |
|
47201
9c930a32cebb
#2621 rename test.test_support to test.support
Benjamin Peterson <benjamin@python.org>
parents:
45061
diff
changeset
|
272 support.run_unittest(*test_classes) |
|
27036
41f7726e3e51
Allow list sort's comparison function to explicitly be None. See SF patch
Skip Montanaro <skip@pobox.com>
parents:
26161
diff
changeset
|
273 |
|
30697
1345c23a0591
* list.sort() now supports three keyword arguments: cmp, key, and reverse.
Raymond Hettinger <python@rcn.com>
parents:
27036
diff
changeset
|
274 # verify reference counting |
|
1345c23a0591
* list.sort() now supports three keyword arguments: cmp, key, and reverse.
Raymond Hettinger <python@rcn.com>
parents:
27036
diff
changeset
|
275 if verbose and hasattr(sys, "gettotalrefcount"): |
|
1345c23a0591
* list.sort() now supports three keyword arguments: cmp, key, and reverse.
Raymond Hettinger <python@rcn.com>
parents:
27036
diff
changeset
|
276 import gc |
|
1345c23a0591
* list.sort() now supports three keyword arguments: cmp, key, and reverse.
Raymond Hettinger <python@rcn.com>
parents:
27036
diff
changeset
|
277 counts = [None] * 5 |
|
41642
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
40775
diff
changeset
|
278 for i in range(len(counts)): |
|
47201
9c930a32cebb
#2621 rename test.test_support to test.support
Benjamin Peterson <benjamin@python.org>
parents:
45061
diff
changeset
|
279 support.run_unittest(*test_classes) |
|
30697
1345c23a0591
* list.sort() now supports three keyword arguments: cmp, key, and reverse.
Raymond Hettinger <python@rcn.com>
parents:
27036
diff
changeset
|
280 gc.collect() |
|
1345c23a0591
* list.sort() now supports three keyword arguments: cmp, key, and reverse.
Raymond Hettinger <python@rcn.com>
parents:
27036
diff
changeset
|
281 counts[i] = sys.gettotalrefcount() |
|
40775
4cdf21a0dbbc
Fix most trivially-findable print statements.
Guido van Rossum <guido@python.org>
parents:
39644
diff
changeset
|
282 print(counts) |
|
30697
1345c23a0591
* list.sort() now supports three keyword arguments: cmp, key, and reverse.
Raymond Hettinger <python@rcn.com>
parents:
27036
diff
changeset
|
283 |
|
1345c23a0591
* list.sort() now supports three keyword arguments: cmp, key, and reverse.
Raymond Hettinger <python@rcn.com>
parents:
27036
diff
changeset
|
284 if __name__ == "__main__": |
|
1345c23a0591
* list.sort() now supports three keyword arguments: cmp, key, and reverse.
Raymond Hettinger <python@rcn.com>
parents:
27036
diff
changeset
|
285 test_main(verbose=True) |
