]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
#11910: Fix test_heapq to skip the C tests when _heapq is missing.
authorEzio Melotti <ezio.melotti@gmail.com>
Mon, 9 May 2011 04:15:04 +0000 (07:15 +0300)
committerEzio Melotti <ezio.melotti@gmail.com>
Mon, 9 May 2011 04:15:04 +0000 (07:15 +0300)
Lib/test/test_heapq.py
Misc/NEWS

index 5e3b0ee981049de1a31099626586bd715b46c9f1..3016c301a1fa87ea000e3367690e7657209f96be 100644 (file)
@@ -1,16 +1,31 @@
 """Unittests for heapq."""
 
+import sys
 import random
-import unittest
+
 from test import support
-import sys
+from unittest import TestCase, skipUnless
 
-# 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'])
+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
+func_names = ['heapify', 'heappop', 'heappush', 'heappushpop',
+              'heapreplace', '_nlargest', '_nsmallest']
+
+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(unittest.TestCase):
+
+class TestHeap(TestCase):
     module = None
 
     def test_push_pop(self):
@@ -176,16 +191,12 @@ class TestHeap(unittest.TestCase):
                 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
 
@@ -211,12 +222,6 @@ class TestHeapC(TestHeap):
         self.assertEqual(hsort(data, LT), target)
         self.assertRaises(TypeError, data, LE)
 
-    # As an early adopter, we sanity check the
-    # test.support.import_fresh_module utility function
-    def test_accelerated(self):
-        self.assertTrue(sys.modules['heapq'] is self.module)
-        self.assertFalse(hasattr(self.module.heapify, '__code__'))
-
 
 #==============================================================================
 
@@ -313,7 +318,9 @@ def L(seqn):
     'Test multiple tiers of iterators'
     return chain(map(lambda x:x, R(Ig(G(seqn)))))
 
-class TestErrorHandling(unittest.TestCase):
+
+@skipUnless(c_heapq, 'requires _heapq')
+class TestErrorHandling(TestCase):
     # only for C implementation
     module = c_heapq
 
@@ -372,7 +379,7 @@ class TestErrorHandling(unittest.TestCase):
 def test_main(verbose=None):
     from types import BuiltinFunctionType
 
-    test_classes = [TestHeapPython, TestHeapC, TestErrorHandling]
+    test_classes = [TestModules, TestHeapPython, TestHeapC, TestErrorHandling]
     support.run_unittest(*test_classes)
 
     # verify reference counting
index c1d40c1be9100f7b5193c25a46ef7d6c53d9837f..86d222086df6e34a34070ec7271de145781bddaf 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -353,6 +353,8 @@ Build
 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 #11719: Fix message about unexpected test_msilib skip on non-Windows