Fix test_warnings by making the state of things more consistent for each test

when it is run.
This commit is contained in:
Brett Cannon 2008-04-13 02:42:36 +00:00
parent 037d829319
commit 667bb4f236
1 changed files with 42 additions and 29 deletions

View File

@ -8,9 +8,10 @@ from test import test_support
import warning_tests import warning_tests
import warnings as original_warnings
sys.modules['_warnings'] = 0 sys.modules['_warnings'] = 0
if 'warnings' in sys.modules: del sys.modules['warnings']
del sys.modules['warnings']
import warnings as py_warnings import warnings as py_warnings
@ -19,6 +20,9 @@ del sys.modules['warnings']
import warnings as c_warnings import warnings as c_warnings
sys.modules['warnings'] = original_warnings
@contextmanager @contextmanager
def warnings_state(module): def warnings_state(module):
"""Use a specific warnings implementation in warning_tests.""" """Use a specific warnings implementation in warning_tests."""
@ -40,16 +44,32 @@ def warnings_state(module):
warning_tests.warnings = original_warnings warning_tests.warnings = original_warnings
class FilterTests(unittest.TestCase): class BaseTest(unittest.TestCase):
"""Testing the filtering functionality.""" """Basic bookkeeping required for testing."""
def setUp(self): def setUp(self):
global __warningregistry__ # The __warningregistry__ needs to be in a pristine state for tests
try: # to work properly.
__warningregistry__.clear() if '__warningregistry__' in globals():
except NameError: del globals()['__warningregistry__']
pass if hasattr(warning_tests, '__warningregistry__'):
del warning_tests.__warningregistry__
if hasattr(sys, '__warningregistry__'):
del sys.__warningregistry__
# The 'warnings' module must be explicitly set so that the proper
# interaction between _warnings and 'warnings' can be controlled.
sys.modules['warnings'] = self.module
super(BaseTest, self).setUp()
def tearDown(self):
sys.modules['warnings'] = original_warnings
super(BaseTest, self).tearDown()
class FilterTests(object):
"""Testing the filtering functionality."""
def test_error(self): def test_error(self):
with test_support.catch_warning(self.module) as w: with test_support.catch_warning(self.module) as w:
@ -164,10 +184,10 @@ class FilterTests(unittest.TestCase):
self.assertEqual(str(w.message), text) self.assertEqual(str(w.message), text)
self.assert_(w.category is UserWarning) self.assert_(w.category is UserWarning)
class CFilterTests(FilterTests): class CFilterTests(BaseTest, FilterTests):
module = c_warnings module = c_warnings
class PyFilterTests(FilterTests): class PyFilterTests(BaseTest, FilterTests):
module = py_warnings module = py_warnings
@ -210,10 +230,10 @@ class WarnTests(unittest.TestCase):
self.assertEqual(os.path.basename(w.filename), "sys") self.assertEqual(os.path.basename(w.filename), "sys")
class CWarnTests(WarnTests): class CWarnTests(BaseTest, WarnTests):
module = c_warnings module = c_warnings
class PyWarnTests(WarnTests): class PyWarnTests(BaseTest, WarnTests):
module = py_warnings module = py_warnings
@ -232,14 +252,14 @@ class WCmdLineTests(unittest.TestCase):
self.module._setoption('error::Warning::0') self.module._setoption('error::Warning::0')
self.assertRaises(UserWarning, self.module.warn, 'convert to error') self.assertRaises(UserWarning, self.module.warn, 'convert to error')
class CWCmdLineTests(WCmdLineTests): class CWCmdLineTests(BaseTest, WCmdLineTests):
module = c_warnings module = c_warnings
class PyWCmdLineTests(WCmdLineTests): class PyWCmdLineTests(BaseTest, WCmdLineTests):
module = py_warnings module = py_warnings
class _WarningsTests(unittest.TestCase): class _WarningsTests(BaseTest):
"""Tests specific to the _warnings module.""" """Tests specific to the _warnings module."""
@ -362,30 +382,23 @@ class WarningsDisplayTests(unittest.TestCase):
file_object, expected_file_line) file_object, expected_file_line)
self.failUnlessEqual(expect, file_object.getvalue()) self.failUnlessEqual(expect, file_object.getvalue())
class CWarningsDisplayTests(WarningsDisplayTests): class CWarningsDisplayTests(BaseTest, WarningsDisplayTests):
module = c_warnings module = c_warnings
class PyWarningsDisplayTests(WarningsDisplayTests): class PyWarningsDisplayTests(BaseTest, WarningsDisplayTests):
module = py_warnings module = py_warnings
def test_main(): def test_main():
# Obscure hack so that this test passes after reloads or repeated calls test_support.run_unittest(CFilterTests,
# to test_main (regrtest -R). PyFilterTests,
if '__warningregistry__' in globals(): CWarnTests,
del globals()['__warningregistry__'] PyWarnTests,
if hasattr(warning_tests, '__warningregistry__'):
del warning_tests.__warningregistry__
if hasattr(sys, '__warningregistry__'):
del sys.__warningregistry__
test_support.run_unittest(CFilterTests, PyFilterTests,
CWarnTests, PyWarnTests,
CWCmdLineTests, PyWCmdLineTests, CWCmdLineTests, PyWCmdLineTests,
_WarningsTests, _WarningsTests,
CWarningsDisplayTests, PyWarningsDisplayTests, CWarningsDisplayTests, PyWarningsDisplayTests,
) )
if __name__ == "__main__": if __name__ == "__main__":
test_main() test_main()