(original) (raw)

changeset: 69961:4f3f67a595fb branch: 3.2 parent: 69960:07d124f340cd parent: 69959:677ee366c9f5 user: Ezio Melotti ezio.melotti@gmail.com date: Mon May 09 07:27:20 2011 +0300 files: Lib/test/test_heapq.py Misc/NEWS description: #11910: merge with 3.1. diff -r 07d124f340cd -r 4f3f67a595fb Lib/test/test_heapq.py --- a/Lib/test/test_heapq.py Mon May 09 07:20:47 2011 +0300 +++ b/Lib/test/test_heapq.py Mon May 09 07:27:20 2011 +0300 @@ -1,16 +1,31 @@ """Unittests for heapq.""" +import sys import random -import unittest + from test import support -import sys +from unittest import TestCase, skipUnless + +py_heapq = support.import_fresh_module('heapq', blocked=['_heapq']) +c_heapq = support.import_fresh_module('heapq', fresh=['_heapq']) -# We do a bit of trickery here to be able to test both the C implementation -# and the Python implementation of the module. -import heapq as c_heapq -py_heapq = support.import_fresh_module('heapq', blocked=['_heapq']) +# _heapq.nlargest/nsmallest are saved in heapq._nlargest/_smallest when +# _heapq is imported, so check them there +func_names = ['heapify', 'heappop', 'heappush', 'heappushpop', + 'heapreplace', '_nlargest', '_nsmallest'] -class TestHeap(unittest.TestCase): +class TestModules(TestCase): + def test_py_functions(self): + for fname in func_names: + self.assertEqual(getattr(py_heapq, fname).__module__, 'heapq') + + @skipUnless(c_heapq, 'requires _heapq') + def test_c_functions(self): + for fname in func_names: + self.assertEqual(getattr(c_heapq, fname).__module__, '_heapq') + + +class TestHeap(TestCase): module = None def test_push_pop(self): @@ -176,16 +191,12 @@ self.assertEqual(list(self.module.nlargest(n, data, key=f)), sorted(data, key=f, reverse=True)[:n]) + class TestHeapPython(TestHeap): module = py_heapq - # As an early adopter, we sanity check the - # test.support.import_fresh_module utility function - def test_pure_python(self): - self.assertFalse(sys.modules['heapq'] is self.module) - self.assertTrue(hasattr(self.module.heapify, '__code__')) - +@skipUnless(c_heapq, 'requires _heapq') class TestHeapC(TestHeap): module = c_heapq @@ -307,7 +318,8 @@ 'Test multiple tiers of iterators' return chain(map(lambda x:x, R(Ig(G(seqn))))) -class TestErrorHandling(unittest.TestCase): + +class TestErrorHandling(TestCase): module = None def test_non_sequence(self): @@ -358,9 +370,11 @@ self.assertRaises(TypeError, f, 2, N(s)) self.assertRaises(ZeroDivisionError, f, 2, E(s)) + class TestErrorHandlingPython(TestErrorHandling): module = py_heapq +@skipUnless(c_heapq, 'requires _heapq') class TestErrorHandlingC(TestErrorHandling): module = c_heapq @@ -369,8 +383,8 @@ def test_main(verbose=None): - test_classes = [TestHeapPython, TestHeapC, TestErrorHandlingPython, - TestErrorHandlingC] + test_classes = [TestModules, TestHeapPython, TestHeapC, + TestErrorHandlingPython, TestErrorHandlingC] support.run_unittest(*test_classes) # verify reference counting diff -r 07d124f340cd -r 4f3f67a595fb Misc/NEWS --- a/Misc/NEWS Mon May 09 07:20:47 2011 +0300 +++ b/Misc/NEWS Mon May 09 07:27:20 2011 +0300 @@ -826,6 +826,8 @@ Tests ----- +- Issue #11910: Fix test_heapq to skip the C tests when _heapq is missing. + - Fix test_startfile to wait for child process to terminate before finishing. - Issue #10822: Fix test_posix:test_getgroups failure under Solaris. Patch /ezio.melotti@gmail.com