cpython: 3cbbb2a7c56d (original) (raw)
--- a/Lib/test/test_heapq.py +++ b/Lib/test/test_heapq.py @@ -1,16 +1,31 @@ """Unittests for heapq.""" +import sys import random -import unittest + from test import test_support -import sys +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']) -# 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 = test_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'][](#l1.24)
-class TestHeap(unittest.TestCase): +class TestModules(TestCase):
- def test_py_functions(self):
for fname in func_names:[](#l1.29)
self.assertEqual(getattr(py_heapq, fname).__module__, 'heapq')[](#l1.30)
- @skipUnless(c_heapq, 'requires _heapq')
- def test_c_functions(self):
for fname in func_names:[](#l1.34)
self.assertEqual(getattr(c_heapq, fname).__module__, '_heapq')[](#l1.35)
+ + +class TestHeap(TestCase): module = None def test_push_pop(self): @@ -175,16 +190,12 @@ class TestHeap(unittest.TestCase): self.assertEqual(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)[](#l1.53)
self.assertTrue(hasattr(self.module.heapify, 'func_code'))[](#l1.54)
- +@skipUnless(c_heapq, 'requires _heapq') class TestHeapC(TestHeap): module = c_heapq @@ -304,7 +315,7 @@ def L(seqn): 'Test multiple tiers of iterators' return chain(imap(lambda x:x, R(Ig(G(seqn))))) -class TestErrorHandling(unittest.TestCase): +class TestErrorHandling(TestCase): def test_non_sequence(self): for f in (self.module.heapify, self.module.heappop): @@ -349,9 +360,12 @@ class TestErrorHandling(unittest.TestCas self.assertRaises(TypeError, f, 2, N(s)) self.assertRaises(ZeroDivisionError, f, 2, E(s)) + class TestErrorHandling_Python(TestErrorHandling): module = py_heapq + +@skipUnless(c_heapq, 'requires _heapq') class TestErrorHandling_C(TestErrorHandling): module = c_heapq @@ -360,8 +374,8 @@ class TestErrorHandling_C(TestErrorHandl def test_main(verbose=None):
- test_classes = [TestModules, TestHeapPython, TestHeapC,
test_support.run_unittest(*test_classes)TestErrorHandling_Python, TestErrorHandling_C][](#l1.90)
verify reference counting
--- a/Misc/NEWS +++ b/Misc/NEWS @@ -421,6 +421,8 @@ IDLE Tests ----- +- Issue #11910: Fix test_heapq to skip the C tests when _heapq is missing. +