diff options
Diffstat (limited to 'Lib/test/test_heapq.py')
-rw-r--r-- | Lib/test/test_heapq.py | 70 |
1 files changed, 39 insertions, 31 deletions
diff --git a/Lib/test/test_heapq.py b/Lib/test/test_heapq.py index 5932a40c28a..e0c49c110f6 100644 --- a/Lib/test/test_heapq.py +++ b/Lib/test/test_heapq.py @@ -3,11 +3,11 @@ import sys import random -from test import test_support +from test import support from unittest import TestCase, skipUnless -py_heapq = test_support.import_fresh_module('heapq', blocked=['_heapq']) -c_heapq = test_support.import_fresh_module('heapq', fresh=['_heapq']) +py_heapq = support.import_fresh_module('heapq', blocked=['_heapq']) +c_heapq = support.import_fresh_module('heapq', fresh=['_heapq']) # _heapq.nlargest/nsmallest are saved in heapq._nlargest/_smallest when # _heapq is imported, so check them there @@ -137,7 +137,7 @@ class TestHeap(TestCase): def test_heapsort(self): # Exercise everything with repeated heapsort checks - for trial in xrange(100): + for trial in range(100): size = random.randrange(50) data = [random.randrange(25) for i in range(size)] if trial & 1: # Half of the time, use heapify @@ -152,7 +152,7 @@ class TestHeap(TestCase): def test_merge(self): inputs = [] - for i in xrange(random.randrange(5)): + for i in range(random.randrange(5)): row = sorted(random.randrange(1000) for j in range(random.randrange(10))) inputs.append(row) self.assertEqual(sorted(chain(*inputs)), list(self.module.merge(*inputs))) @@ -177,23 +177,25 @@ class TestHeap(TestCase): data = [(random.randrange(2000), i) for i in range(1000)] for f in (None, lambda x: x[0] * 547 % 2000): for n in (0, 1, 2, 10, 100, 400, 999, 1000, 1100): - self.assertEqual(self.module.nsmallest(n, data), sorted(data)[:n]) - self.assertEqual(self.module.nsmallest(n, data, key=f), + self.assertEqual(list(self.module.nsmallest(n, data)), + sorted(data)[:n]) + self.assertEqual(list(self.module.nsmallest(n, data, key=f)), sorted(data, key=f)[:n]) def test_nlargest(self): data = [(random.randrange(2000), i) for i in range(1000)] for f in (None, lambda x: x[0] * 547 % 2000): for n in (0, 1, 2, 10, 100, 400, 999, 1000, 1100): - self.assertEqual(self.module.nlargest(n, data), + self.assertEqual(list(self.module.nlargest(n, data)), sorted(data, reverse=True)[:n]) - self.assertEqual(self.module.nlargest(n, data, key=f), + self.assertEqual(list(self.module.nlargest(n, data, key=f)), sorted(data, key=f, reverse=True)[:n]) def test_comparison_operator(self): - # Issue 3051: Make sure heapq works with both __lt__ and __le__ + # Issue 3051: Make sure heapq works with both __lt__ + # For python 3.0, __le__ alone is not enough def hsort(data, comp): - data = map(comp, data) + data = [comp(x) for x in data] self.module.heapify(data) return [self.module.heappop(data).x for i in range(len(data))] class LT: @@ -209,7 +211,7 @@ class TestHeap(TestCase): data = [random.random() for i in range(100)] target = sorted(data, reverse=True) self.assertEqual(hsort(data, LT), target) - self.assertEqual(hsort(data, LE), target) + self.assertRaises(TypeError, data, LE) class TestHeapPython(TestHeap): @@ -235,8 +237,9 @@ class GetOnly: class CmpErr: "Dummy element that always raises an error during comparison" - def __cmp__(self, other): + def __eq__(self, other): raise ZeroDivisionError + __ne__ = __lt__ = __le__ = __gt__ = __ge__ = __eq__ def R(seqn): 'Regular generator' @@ -257,7 +260,7 @@ class I: self.i = 0 def __iter__(self): return self - def next(self): + def __next__(self): if self.i >= len(self.seqn): raise StopIteration v = self.seqn[self.i] self.i += 1 @@ -277,14 +280,14 @@ class X: def __init__(self, seqn): self.seqn = seqn self.i = 0 - def next(self): + def __next__(self): if self.i >= len(self.seqn): raise StopIteration v = self.seqn[self.i] self.i += 1 return v class N: - 'Iterator missing next()' + 'Iterator missing __next__()' def __init__(self, seqn): self.seqn = seqn self.i = 0 @@ -298,7 +301,7 @@ class E: self.i = 0 def __iter__(self): return self - def next(self): + def __next__(self): 3 // 0 class S: @@ -307,13 +310,14 @@ class S: pass def __iter__(self): return self - def next(self): + def __next__(self): raise StopIteration -from itertools import chain, imap +from itertools import chain def L(seqn): 'Test multiple tiers of iterators' - return chain(imap(lambda x:x, R(Ig(G(seqn))))) + return chain(map(lambda x:x, R(Ig(G(seqn))))) + class TestErrorHandling(TestCase): module = None @@ -334,6 +338,14 @@ class TestErrorHandling(TestCase): self.assertRaises(TypeError, f, 2, LenOnly()) def test_get_only(self): + for f in (self.module.heapify, self.module.heappop): + self.assertRaises(TypeError, f, GetOnly()) + for f in (self.module.heappush, self.module.heapreplace): + self.assertRaises(TypeError, f, GetOnly(), 10) + for f in (self.module.nlargest, self.module.nsmallest): + self.assertRaises(TypeError, f, 2, GetOnly()) + + def test_get_only(self): seq = [CmpErr(), CmpErr(), CmpErr()] for f in (self.module.heapify, self.module.heappop): self.assertRaises(ZeroDivisionError, f, seq) @@ -350,13 +362,10 @@ class TestErrorHandling(TestCase): def test_iterable_args(self): for f in (self.module.nlargest, self.module.nsmallest): - for s in ("123", "", range(1000), ('do', 1.2), xrange(2000,2200,5)): + for s in ("123", "", range(1000), (1, 1.2), range(2000,2200,5)): for g in (G, I, Ig, L, R): - with test_support.check_py3k_warnings( - ("comparing unequal types not supported", - DeprecationWarning), quiet=True): - self.assertEqual(f(2, g(s)), f(2,s)) - self.assertEqual(f(2, S(s)), []) + self.assertEqual(list(f(2, g(s))), list(f(2,s))) + self.assertEqual(list(f(2, S(s))), []) self.assertRaises(TypeError, f, 2, X(s)) self.assertRaises(TypeError, f, 2, N(s)) self.assertRaises(ZeroDivisionError, f, 2, E(s)) @@ -365,7 +374,6 @@ class TestErrorHandling(TestCase): class TestErrorHandlingPython(TestErrorHandling): module = py_heapq - @skipUnless(c_heapq, 'requires _heapq') class TestErrorHandlingC(TestErrorHandling): module = c_heapq @@ -377,17 +385,17 @@ class TestErrorHandlingC(TestErrorHandling): def test_main(verbose=None): test_classes = [TestModules, TestHeapPython, TestHeapC, TestErrorHandlingPython, TestErrorHandlingC] - test_support.run_unittest(*test_classes) + support.run_unittest(*test_classes) # verify reference counting if verbose and hasattr(sys, "gettotalrefcount"): import gc counts = [None] * 5 - for i in xrange(len(counts)): - test_support.run_unittest(*test_classes) + for i in range(len(counts)): + support.run_unittest(*test_classes) gc.collect() counts[i] = sys.gettotalrefcount() - print counts + print(counts) if __name__ == "__main__": test_main(verbose=True) |