From 8269a44d5095cbd0c351aedc41272e9a6d91c269 Mon Sep 17 00:00:00 2001 From: Ezio Melotti Date: Mon, 9 May 2011 07:15:04 +0300 Subject: #11910: Fix test_heapq to skip the C tests when _heapq is missing. --- Lib/test/test_heapq.py | 47 +++++++++++++++++++++++++++-------------------- Misc/NEWS | 2 ++ 2 files changed, 29 insertions(+), 20 deletions(-) diff --git a/Lib/test/test_heapq.py b/Lib/test/test_heapq.py index 5e3b0ee..3016c30 100644 --- 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 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 diff --git a/Misc/NEWS b/Misc/NEWS index c1d40c1..86d2220 100644 --- 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 -- cgit v0.12 From fd69abb3583055f79f933e604039b110b71d7dfe Mon Sep 17 00:00:00 2001 From: Ezio Melotti Date: Mon, 9 May 2011 07:20:47 +0300 Subject: Some tests were incorrectly marked as C specific. --- Lib/test/test_heapq.py | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/Lib/test/test_heapq.py b/Lib/test/test_heapq.py index b41458b..327a64d 100644 --- a/Lib/test/test_heapq.py +++ b/Lib/test/test_heapq.py @@ -308,8 +308,7 @@ def L(seqn): return chain(map(lambda x:x, R(Ig(G(seqn))))) class TestErrorHandling(unittest.TestCase): - # only for C implementation - module = c_heapq + module = None def test_non_sequence(self): for f in (self.module.heapify, self.module.heappop): @@ -359,12 +358,19 @@ class TestErrorHandling(unittest.TestCase): self.assertRaises(TypeError, f, 2, N(s)) self.assertRaises(ZeroDivisionError, f, 2, E(s)) +class TestErrorHandlingPython(TestErrorHandling): + module = py_heapq + +class TestErrorHandlingC(TestErrorHandling): + module = c_heapq + #============================================================================== def test_main(verbose=None): - test_classes = [TestHeapPython, TestHeapC, TestErrorHandling] + test_classes = [TestHeapPython, TestHeapC, TestErrorHandlingPython, + TestErrorHandlingC] support.run_unittest(*test_classes) # verify reference counting -- cgit v0.12