Mercurial > cpython-lru_cache-weakref
view Lib/test/test_code_module.py @ 87690:66c1c9f32567 default tip
Add use_weakref option to functools.lru_cache
The use_weakref option makes lru_cache create weak references to the function
arguments when creating the cache key, which prevents them from staying in the
memory forever even after all other references to them are gone.
This is a proof of concept for http://bugs.python.org/issue19859
| author | Radomir Dopieralski <devel@sheep.art.pl> |
|---|---|
| date | Tue, 03 Dec 2013 16:02:48 +0100 |
| parents | 2933598a7802 |
| children |
line wrap: on
line source
"Test InteractiveConsole and InteractiveInterpreter from code module" import sys import unittest from contextlib import ExitStack from unittest import mock from test import support code = support.import_module('code') class TestInteractiveConsole(unittest.TestCase): def setUp(self): self.console = code.InteractiveConsole() self.mock_sys() def mock_sys(self): "Mock system environment for InteractiveConsole" # use exit stack to match patch context managers to addCleanup stack = ExitStack() self.addCleanup(stack.close) self.infunc = stack.enter_context(mock.patch('code.input', create=True)) self.stdout = stack.enter_context(mock.patch('code.sys.stdout')) self.stderr = stack.enter_context(mock.patch('code.sys.stderr')) prepatch = mock.patch('code.sys', wraps=code.sys, spec=code.sys) self.sysmod = stack.enter_context(prepatch) if sys.excepthook is sys.__excepthook__: self.sysmod.excepthook = self.sysmod.__excepthook__ def test_ps1(self): self.infunc.side_effect = EOFError('Finished') self.console.interact() self.assertEqual(self.sysmod.ps1, '>>> ') def test_ps2(self): self.infunc.side_effect = EOFError('Finished') self.console.interact() self.assertEqual(self.sysmod.ps2, '... ') def test_console_stderr(self): self.infunc.side_effect = ["'antioch'", "", EOFError('Finished')] self.console.interact() for call in list(self.stdout.method_calls): if 'antioch' in ''.join(call[1]): break else: raise AssertionError("no console stdout") def test_syntax_error(self): self.infunc.side_effect = ["undefined", EOFError('Finished')] self.console.interact() for call in self.stderr.method_calls: if 'NameError:' in ''.join(call[1]): break else: raise AssertionError("No syntax error from console") def test_sysexcepthook(self): self.infunc.side_effect = ["raise ValueError('')", EOFError('Finished')] hook = mock.Mock() self.sysmod.excepthook = hook self.console.interact() self.assertTrue(hook.called) def test_banner(self): # with banner self.infunc.side_effect = EOFError('Finished') self.console.interact(banner='Foo') self.assertEqual(len(self.stderr.method_calls), 2) banner_call = self.stderr.method_calls[0] self.assertEqual(banner_call, ['write', ('Foo\n',), {}]) # no banner self.stderr.reset_mock() self.infunc.side_effect = EOFError('Finished') self.console.interact(banner='') self.assertEqual(len(self.stderr.method_calls), 1) def test_main(): support.run_unittest(TestInteractiveConsole) if __name__ == "__main__": unittest.main()
