Author: Yannick Jadoul <[email protected]>
Branch: py3.7-pep553
Changeset: r97792:085278e256df
Date: 2019-10-15 19:53 +0200
http://bitbucket.org/pypy/pypy/changeset/085278e256df/
Log: Adding tests for breakpoint() and sys.breakpointhook()
diff --git a/pypy/module/__builtin__/test/test_breakpoint.py
b/pypy/module/__builtin__/test/test_breakpoint.py
new file mode 100644
--- /dev/null
+++ b/pypy/module/__builtin__/test/test_breakpoint.py
@@ -0,0 +1,158 @@
+class AppTestBreakpoint:
+ def setup_class(cls):
+ cls.w_import_mock_pdb = cls.space.appexec([], """():
+ import sys
+ from contextlib import contextmanager
+ from types import ModuleType
+
+ @contextmanager
+ def w_import_mock_pdb():
+ try:
+ mock_pdb = ModuleType('pdb')
+ mock_pdb.set_trace = None
+ sys.modules['pdb'] = mock_pdb
+ yield mock_pdb
+ finally:
+ del sys.modules['pdb']
+
+ return w_import_mock_pdb
+ """)
+
+ cls.w_mock_function = cls.space.appexec([], """():
+ from contextlib import contextmanager
+
+ class MockedCallable:
+ def __init__(self):
+ self.called = 0
+
+ def __call__(self, *args, **kwargs):
+ self.called += 1
+ self.last_call = (args, kwargs)
+
+ @contextmanager
+ def mock_function(scope, attr, delete=False):
+ old = getattr(scope, attr)
+ try:
+ if not delete:
+ new = MockedCallable()
+ setattr(scope, attr, new)
+ yield new
+ else:
+ delattr(scope, attr)
+ yield
+ finally:
+ setattr(scope, attr, old)
+
+ return mock_function
+ """)
+
+
+ def test_default(self):
+ import sys
+ assert sys.breakpointhook is sys.__breakpointhook__
+
+ import os
+ assert 'PYTHONBREAKPOINT' not in os.environ
+
+ with self.import_mock_pdb() as pdb:
+ with self.mock_function(pdb, 'set_trace') as mocked:
+ breakpoint()
+ assert mocked.called == 1
+
+
+ def test_args_kwargs(self):
+ import sys
+ with self.import_mock_pdb() as pdb:
+ with self.mock_function(pdb, 'set_trace') as mocked:
+ breakpoint(1, 2, 3, x=4, y=5)
+ assert mocked.called == 1
+ assert mocked.last_call == ((1, 2, 3), {'x': 4, 'y': 5})
+
+
+ def test_breakpointhook(self):
+ import sys
+ with self.import_mock_pdb() as pdb:
+ with self.mock_function(sys, 'breakpointhook') as mocked, \
+ self.mock_function(pdb, 'set_trace') as mocked_pdb:
+ breakpoint()
+ assert mocked.called == 1
+ assert mocked_pdb.called == 0
+
+ with self.mock_function(pdb, 'set_trace') as mocked_pdb:
+ breakpoint()
+ assert mocked_pdb.called == 1
+
+
+ def test_breakpointhook_lost(self):
+ import sys
+ with self.import_mock_pdb() as pdb:
+ with self.mock_function(sys, 'breakpointhook', delete=True):
+ with raises(RuntimeError) as excinfo:
+ breakpoint()
+ assert str(excinfo.value) == "lost sys.breakpointhook"
+
+
+ def test_env_default(self):
+ import os
+ try:
+ os.environ['PYTHONBREAKPOINT'] = ""
+
+ import sys
+ with self.import_mock_pdb() as pdb:
+ with self.mock_function(pdb, 'set_trace') as mocked:
+ breakpoint()
+ assert mocked.called == 1
+ finally:
+ del os.environ['PYTHONBREAKPOINT']
+
+
+ def test_env_disable(self):
+ import os
+ try:
+ os.environ['PYTHONBREAKPOINT'] = "0"
+
+ import sys
+ with self.import_mock_pdb() as pdb:
+ with self.mock_function(pdb, 'set_trace') as mocked:
+ breakpoint()
+ assert mocked.called == 0
+
+ with self.mock_function(sys, 'breakpointhook') as mocked:
+ breakpoint()
+ assert mocked.called == 1
+ finally:
+ del os.environ['PYTHONBREAKPOINT']
+
+
+ def test_env_other(self):
+ import os
+ try:
+ os.environ['PYTHONBREAKPOINT'] = 'sys.exit'
+
+ import sys
+ with self.import_mock_pdb() as pdb:
+ with self.mock_function(sys, 'exit') as mocked, \
+ self.mock_function(pdb, 'set_trace') as mocked_pdb:
+ breakpoint()
+ assert mocked.called == 1
+ assert mocked_pdb.called == 0
+ finally:
+ del os.environ['PYTHONBREAKPOINT']
+
+
+ def test_env_nonexistent(self):
+ import os
+ import warnings
+ try:
+ os.environ['PYTHONBREAKPOINT'] = 'blah.bleh'
+
+ import sys
+ with self.import_mock_pdb() as pdb:
+ with self.mock_function(pdb, 'set_trace') as mocked_pdb, \
+ warnings.catch_warnings(record=True) as w:
+ breakpoint()
+ assert mocked_pdb.called == 0
+ assert len(w) == 1
+ assert str(w[-1].message) == 'Ignoring unimportable
$PYTHONBREAKPOINT: "blah.bleh"'
+ finally:
+ del os.environ['PYTHONBREAKPOINT']
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit