[Python-checkins] cpython (2.7): #11910: Fix test_heapq to skip the C tests when _heapq is missing.

ezio.melotti python-checkins at python.org
Mon May 9 06:30:36 CEST 2011


http://hg.python.org/cpython/rev/3cbbb2a7c56d
changeset:   69958:3cbbb2a7c56d
branch:      2.7
parent:      69954:c1a12a308c5b
user:        Ezio Melotti <ezio.melotti at gmail.com>
date:        Mon May 09 06:54:53 2011 +0300
summary:
  #11910: Fix test_heapq to skip the C tests when _heapq is missing.

files:
  Lib/test/test_heapq.py |  44 +++++++++++++++++++----------
  Misc/NEWS              |   2 +
  2 files changed, 31 insertions(+), 15 deletions(-)


diff --git a/Lib/test/test_heapq.py b/Lib/test/test_heapq.py
--- 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
 
-# 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'])
+c_heapq = test_support.import_fresh_module('heapq', fresh=['_heapq'])
 
-class TestHeap(unittest.TestCase):
+# _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(TestCase):
     module = None
 
     def test_push_pop(self):
@@ -175,16 +190,12 @@
                 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)
-        self.assertTrue(hasattr(self.module.heapify, 'func_code'))
 
-
+ at skipUnless(c_heapq, 'requires _heapq')
 class TestHeapC(TestHeap):
     module = c_heapq
 
@@ -304,7 +315,7 @@
     '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 @@
                 self.assertRaises(TypeError, f, 2, N(s))
                 self.assertRaises(ZeroDivisionError, f, 2, E(s))
 
+
 class TestErrorHandling_Python(TestErrorHandling):
     module = py_heapq
 
+
+ at skipUnless(c_heapq, 'requires _heapq')
 class TestErrorHandling_C(TestErrorHandling):
     module = c_heapq
 
@@ -360,8 +374,8 @@
 
 
 def test_main(verbose=None):
-    test_classes = [TestHeapPython, TestHeapC, TestErrorHandling_Python,
-                    TestErrorHandling_C]
+    test_classes = [TestModules, TestHeapPython, TestHeapC,
+                    TestErrorHandling_Python, TestErrorHandling_C]
     test_support.run_unittest(*test_classes)
 
     # verify reference counting
diff --git a/Misc/NEWS b/Misc/NEWS
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -421,6 +421,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 #11719: Fix message about unexpected test_msilib skip on non-Windows

-- 
Repository URL: http://hg.python.org/cpython


More information about the Python-checkins mailing list