| 
									
										
										
										
											2010-07-30 09:14:20 +00:00
										 |  |  | # A test suite for pdb; not very comprehensive at the moment. | 
					
						
							| 
									
										
										
										
											2012-05-02 07:41:22 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-03-18 10:09:50 -07:00
										 |  |  | import doctest | 
					
						
							| 
									
										
										
										
											2016-09-09 22:21:17 -07:00
										 |  |  | import os | 
					
						
							| 
									
										
										
										
											2010-07-30 14:16:43 +00:00
										 |  |  | import pdb | 
					
						
							| 
									
										
										
										
											2009-05-05 09:00:19 +00:00
										 |  |  | import sys | 
					
						
							| 
									
										
										
										
											2013-06-15 17:11:25 -04:00
										 |  |  | import types | 
					
						
							| 
									
										
										
										
											2020-06-21 11:07:50 +03:00
										 |  |  | import codecs | 
					
						
							| 
									
										
										
										
											2010-07-30 14:16:43 +00:00
										 |  |  | import unittest | 
					
						
							|  |  |  | import subprocess | 
					
						
							| 
									
										
										
										
											2012-05-01 10:07:49 +08:00
										 |  |  | import textwrap | 
					
						
							| 
									
										
										
										
											2021-05-12 01:26:30 +02:00
										 |  |  | import linecache | 
					
						
							| 
									
										
										
										
											2024-05-02 13:53:27 -07:00
										 |  |  | import zipapp | 
					
						
							| 
									
										
										
										
											2009-05-05 09:00:19 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-09-15 20:19:31 +02:00
										 |  |  | from contextlib import ExitStack, redirect_stdout | 
					
						
							| 
									
										
										
										
											2017-09-22 12:29:42 -04:00
										 |  |  | from io import StringIO | 
					
						
							| 
									
										
										
										
											2022-03-22 12:04:36 +02:00
										 |  |  | from test import support | 
					
						
							| 
									
										
										
										
											2024-05-04 03:26:40 -07:00
										 |  |  | from test.support import force_not_colorized, os_helper | 
					
						
							| 
									
										
										
										
											2023-11-13 02:23:06 -08:00
										 |  |  | from test.support.import_helper import import_module | 
					
						
							| 
									
										
										
										
											2024-01-18 18:58:11 +03:00
										 |  |  | from test.support.pty_helper import run_pty, FakeInput | 
					
						
							| 
									
										
										
										
											2017-09-22 12:29:42 -04:00
										 |  |  | from unittest.mock import patch | 
					
						
							| 
									
										
										
										
											2009-05-05 09:00:19 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-01-19 16:00:34 +03:00
										 |  |  | # gh-114275: WASI fails to run asyncio tests, similar skip than test_asyncio. | 
					
						
							|  |  |  | SKIP_ASYNCIO_TESTS = (not support.has_socket_support) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-05-05 09:00:19 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-09-16 16:40:45 +00:00
										 |  |  | class PdbTestInput(object): | 
					
						
							|  |  |  |     """Context manager that makes testing Pdb in doctests easier.""" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def __init__(self, input): | 
					
						
							|  |  |  |         self.input = input | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def __enter__(self): | 
					
						
							|  |  |  |         self.real_stdin = sys.stdin | 
					
						
							| 
									
										
										
										
											2024-01-18 18:58:11 +03:00
										 |  |  |         sys.stdin = FakeInput(self.input) | 
					
						
							| 
									
										
										
										
											2011-02-21 19:29:56 +00:00
										 |  |  |         self.orig_trace = sys.gettrace() if hasattr(sys, 'gettrace') else None | 
					
						
							| 
									
										
										
										
											2009-09-16 16:40:45 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def __exit__(self, *exc): | 
					
						
							|  |  |  |         sys.stdin = self.real_stdin | 
					
						
							| 
									
										
										
										
											2011-02-21 19:29:56 +00:00
										 |  |  |         if self.orig_trace: | 
					
						
							|  |  |  |             sys.settrace(self.orig_trace) | 
					
						
							| 
									
										
										
										
											2009-09-16 16:40:45 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def test_pdb_displayhook(): | 
					
						
							|  |  |  |     """This tests the custom displayhook for pdb.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     >>> def test_function(foo, bar): | 
					
						
							| 
									
										
										
										
											2016-09-09 22:21:17 -07:00
										 |  |  |     ...     import pdb; pdb.Pdb(nosigint=True, readrc=False).set_trace() | 
					
						
							| 
									
										
										
										
											2009-09-16 16:40:45 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     >>> with PdbTestInput([ | 
					
						
							|  |  |  |     ...     'foo', | 
					
						
							|  |  |  |     ...     'bar', | 
					
						
							|  |  |  |     ...     'for i in range(5): print(i)', | 
					
						
							|  |  |  |     ...     'continue', | 
					
						
							|  |  |  |     ... ]): | 
					
						
							|  |  |  |     ...     test_function(1, None) | 
					
						
							| 
									
										
										
										
											2024-05-05 07:05:01 -07:00
										 |  |  |     > <doctest test.test_pdb.test_pdb_displayhook[0]>(2)test_function() | 
					
						
							|  |  |  |     -> import pdb; pdb.Pdb(nosigint=True, readrc=False).set_trace() | 
					
						
							| 
									
										
										
										
											2009-09-16 16:40:45 +00:00
										 |  |  |     (Pdb) foo | 
					
						
							|  |  |  |     1 | 
					
						
							|  |  |  |     (Pdb) bar | 
					
						
							|  |  |  |     (Pdb) for i in range(5): print(i) | 
					
						
							|  |  |  |     0 | 
					
						
							|  |  |  |     1 | 
					
						
							|  |  |  |     2 | 
					
						
							|  |  |  |     3 | 
					
						
							|  |  |  |     4 | 
					
						
							|  |  |  |     (Pdb) continue | 
					
						
							|  |  |  |     """
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-07-30 16:00:46 +00:00
										 |  |  | def test_pdb_basic_commands(): | 
					
						
							|  |  |  |     """Test the basic commands of pdb.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     >>> def test_function_2(foo, bar='default'): | 
					
						
							|  |  |  |     ...     print(foo) | 
					
						
							|  |  |  |     ...     for i in range(5): | 
					
						
							|  |  |  |     ...         print(i) | 
					
						
							|  |  |  |     ...     print(bar) | 
					
						
							|  |  |  |     ...     for i in range(10): | 
					
						
							|  |  |  |     ...         never_executed | 
					
						
							|  |  |  |     ...     print('after for') | 
					
						
							|  |  |  |     ...     print('...') | 
					
						
							|  |  |  |     ...     return foo.upper() | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-05-21 00:17:30 +02:00
										 |  |  |     >>> def test_function3(arg=None, *, kwonly=None): | 
					
						
							|  |  |  |     ...     pass | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-05-24 22:44:31 +02:00
										 |  |  |     >>> def test_function4(a, b, c, /): | 
					
						
							|  |  |  |     ...     pass | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-07-30 16:00:46 +00:00
										 |  |  |     >>> def test_function(): | 
					
						
							| 
									
										
										
										
											2016-09-09 22:21:17 -07:00
										 |  |  |     ...     import pdb; pdb.Pdb(nosigint=True, readrc=False).set_trace() | 
					
						
							| 
									
										
										
										
											2010-07-30 16:00:46 +00:00
										 |  |  |     ...     ret = test_function_2('baz') | 
					
						
							| 
									
										
										
										
											2019-05-21 00:17:30 +02:00
										 |  |  |     ...     test_function3(kwonly=True) | 
					
						
							| 
									
										
										
										
											2019-05-24 22:44:31 +02:00
										 |  |  |     ...     test_function4(1, 2, 3) | 
					
						
							| 
									
										
										
										
											2010-07-30 16:00:46 +00:00
										 |  |  |     ...     print(ret) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     >>> with PdbTestInput([  # doctest: +ELLIPSIS, +NORMALIZE_WHITESPACE | 
					
						
							| 
									
										
										
										
											2024-05-05 07:05:01 -07:00
										 |  |  |     ...     'step',       # go to line ret = test_function_2('baz') | 
					
						
							| 
									
										
										
										
											2010-07-30 16:00:46 +00:00
										 |  |  |     ...     'step',       # entering the function call | 
					
						
							|  |  |  |     ...     'args',       # display function args | 
					
						
							|  |  |  |     ...     'list',       # list function source | 
					
						
							|  |  |  |     ...     'bt',         # display backtrace | 
					
						
							|  |  |  |     ...     'up',         # step up to test_function() | 
					
						
							|  |  |  |     ...     'down',       # step down to test_function_2() again | 
					
						
							|  |  |  |     ...     'next',       # stepping to print(foo) | 
					
						
							|  |  |  |     ...     'next',       # stepping to the for loop | 
					
						
							|  |  |  |     ...     'step',       # stepping into the for loop | 
					
						
							|  |  |  |     ...     'until',      # continuing until out of the for loop | 
					
						
							|  |  |  |     ...     'next',       # executing the print(bar) | 
					
						
							|  |  |  |     ...     'jump 8',     # jump over second for loop | 
					
						
							|  |  |  |     ...     'return',     # return out of function | 
					
						
							|  |  |  |     ...     'retval',     # display return value | 
					
						
							| 
									
										
										
										
											2019-05-21 00:17:30 +02:00
										 |  |  |     ...     'next',       # step to test_function3() | 
					
						
							|  |  |  |     ...     'step',       # stepping into test_function3() | 
					
						
							|  |  |  |     ...     'args',       # display function args | 
					
						
							| 
									
										
										
										
											2019-05-24 22:44:31 +02:00
										 |  |  |     ...     'return',     # return out of function | 
					
						
							|  |  |  |     ...     'next',       # step to test_function4() | 
					
						
							|  |  |  |     ...     'step',       # stepping to test_function4() | 
					
						
							|  |  |  |     ...     'args',       # display function args | 
					
						
							| 
									
										
										
										
											2010-07-30 16:00:46 +00:00
										 |  |  |     ...     'continue', | 
					
						
							|  |  |  |     ... ]): | 
					
						
							|  |  |  |     ...    test_function() | 
					
						
							| 
									
										
										
										
											2024-05-05 07:05:01 -07:00
										 |  |  |     > <doctest test.test_pdb.test_pdb_basic_commands[3]>(2)test_function() | 
					
						
							|  |  |  |     -> import pdb; pdb.Pdb(nosigint=True, readrc=False).set_trace() | 
					
						
							|  |  |  |     (Pdb) step | 
					
						
							| 
									
										
										
										
											2019-05-24 22:44:31 +02:00
										 |  |  |     > <doctest test.test_pdb.test_pdb_basic_commands[3]>(3)test_function() | 
					
						
							| 
									
										
										
										
											2010-07-30 16:00:46 +00:00
										 |  |  |     -> ret = test_function_2('baz') | 
					
						
							|  |  |  |     (Pdb) step | 
					
						
							|  |  |  |     --Call-- | 
					
						
							|  |  |  |     > <doctest test.test_pdb.test_pdb_basic_commands[0]>(1)test_function_2() | 
					
						
							|  |  |  |     -> def test_function_2(foo, bar='default'): | 
					
						
							|  |  |  |     (Pdb) args | 
					
						
							|  |  |  |     foo = 'baz' | 
					
						
							|  |  |  |     bar = 'default' | 
					
						
							|  |  |  |     (Pdb) list | 
					
						
							|  |  |  |       1  ->     def test_function_2(foo, bar='default'): | 
					
						
							|  |  |  |       2             print(foo) | 
					
						
							|  |  |  |       3             for i in range(5): | 
					
						
							|  |  |  |       4                 print(i) | 
					
						
							|  |  |  |       5             print(bar) | 
					
						
							|  |  |  |       6             for i in range(10): | 
					
						
							|  |  |  |       7                 never_executed | 
					
						
							|  |  |  |       8             print('after for') | 
					
						
							|  |  |  |       9             print('...') | 
					
						
							|  |  |  |      10             return foo.upper() | 
					
						
							|  |  |  |     [EOF] | 
					
						
							|  |  |  |     (Pdb) bt | 
					
						
							|  |  |  |     ... | 
					
						
							| 
									
										
										
										
											2024-05-05 07:05:01 -07:00
										 |  |  |       <doctest test.test_pdb.test_pdb_basic_commands[4]>(26)<module>() | 
					
						
							| 
									
										
										
										
											2010-07-30 16:00:46 +00:00
										 |  |  |     -> test_function() | 
					
						
							| 
									
										
										
										
											2019-05-24 22:44:31 +02:00
										 |  |  |       <doctest test.test_pdb.test_pdb_basic_commands[3]>(3)test_function() | 
					
						
							| 
									
										
										
										
											2010-07-30 16:00:46 +00:00
										 |  |  |     -> ret = test_function_2('baz') | 
					
						
							|  |  |  |     > <doctest test.test_pdb.test_pdb_basic_commands[0]>(1)test_function_2() | 
					
						
							|  |  |  |     -> def test_function_2(foo, bar='default'): | 
					
						
							|  |  |  |     (Pdb) up | 
					
						
							| 
									
										
										
										
											2019-05-24 22:44:31 +02:00
										 |  |  |     > <doctest test.test_pdb.test_pdb_basic_commands[3]>(3)test_function() | 
					
						
							| 
									
										
										
										
											2010-07-30 16:00:46 +00:00
										 |  |  |     -> ret = test_function_2('baz') | 
					
						
							|  |  |  |     (Pdb) down | 
					
						
							|  |  |  |     > <doctest test.test_pdb.test_pdb_basic_commands[0]>(1)test_function_2() | 
					
						
							|  |  |  |     -> def test_function_2(foo, bar='default'): | 
					
						
							|  |  |  |     (Pdb) next | 
					
						
							|  |  |  |     > <doctest test.test_pdb.test_pdb_basic_commands[0]>(2)test_function_2() | 
					
						
							|  |  |  |     -> print(foo) | 
					
						
							|  |  |  |     (Pdb) next | 
					
						
							|  |  |  |     baz | 
					
						
							|  |  |  |     > <doctest test.test_pdb.test_pdb_basic_commands[0]>(3)test_function_2() | 
					
						
							|  |  |  |     -> for i in range(5): | 
					
						
							|  |  |  |     (Pdb) step | 
					
						
							|  |  |  |     > <doctest test.test_pdb.test_pdb_basic_commands[0]>(4)test_function_2() | 
					
						
							|  |  |  |     -> print(i) | 
					
						
							|  |  |  |     (Pdb) until | 
					
						
							|  |  |  |     0 | 
					
						
							|  |  |  |     1 | 
					
						
							|  |  |  |     2 | 
					
						
							|  |  |  |     3 | 
					
						
							|  |  |  |     4 | 
					
						
							|  |  |  |     > <doctest test.test_pdb.test_pdb_basic_commands[0]>(5)test_function_2() | 
					
						
							|  |  |  |     -> print(bar) | 
					
						
							|  |  |  |     (Pdb) next | 
					
						
							|  |  |  |     default | 
					
						
							|  |  |  |     > <doctest test.test_pdb.test_pdb_basic_commands[0]>(6)test_function_2() | 
					
						
							|  |  |  |     -> for i in range(10): | 
					
						
							|  |  |  |     (Pdb) jump 8 | 
					
						
							|  |  |  |     > <doctest test.test_pdb.test_pdb_basic_commands[0]>(8)test_function_2() | 
					
						
							|  |  |  |     -> print('after for') | 
					
						
							|  |  |  |     (Pdb) return | 
					
						
							|  |  |  |     after for | 
					
						
							|  |  |  |     ... | 
					
						
							|  |  |  |     --Return-- | 
					
						
							|  |  |  |     > <doctest test.test_pdb.test_pdb_basic_commands[0]>(10)test_function_2()->'BAZ' | 
					
						
							|  |  |  |     -> return foo.upper() | 
					
						
							|  |  |  |     (Pdb) retval | 
					
						
							|  |  |  |     'BAZ' | 
					
						
							| 
									
										
										
										
											2019-05-21 00:17:30 +02:00
										 |  |  |     (Pdb) next | 
					
						
							| 
									
										
										
										
											2019-05-24 22:44:31 +02:00
										 |  |  |     > <doctest test.test_pdb.test_pdb_basic_commands[3]>(4)test_function() | 
					
						
							| 
									
										
										
										
											2019-05-21 00:17:30 +02:00
										 |  |  |     -> test_function3(kwonly=True) | 
					
						
							|  |  |  |     (Pdb) step | 
					
						
							|  |  |  |     --Call-- | 
					
						
							|  |  |  |     > <doctest test.test_pdb.test_pdb_basic_commands[1]>(1)test_function3() | 
					
						
							|  |  |  |     -> def test_function3(arg=None, *, kwonly=None): | 
					
						
							|  |  |  |     (Pdb) args | 
					
						
							|  |  |  |     arg = None | 
					
						
							|  |  |  |     kwonly = True | 
					
						
							| 
									
										
										
										
											2019-05-24 22:44:31 +02:00
										 |  |  |     (Pdb) return | 
					
						
							|  |  |  |     --Return-- | 
					
						
							|  |  |  |     > <doctest test.test_pdb.test_pdb_basic_commands[1]>(2)test_function3()->None | 
					
						
							|  |  |  |     -> pass | 
					
						
							|  |  |  |     (Pdb) next | 
					
						
							|  |  |  |     > <doctest test.test_pdb.test_pdb_basic_commands[3]>(5)test_function() | 
					
						
							|  |  |  |     -> test_function4(1, 2, 3) | 
					
						
							|  |  |  |     (Pdb) step | 
					
						
							|  |  |  |     --Call-- | 
					
						
							|  |  |  |     > <doctest test.test_pdb.test_pdb_basic_commands[2]>(1)test_function4() | 
					
						
							|  |  |  |     -> def test_function4(a, b, c, /): | 
					
						
							|  |  |  |     (Pdb) args | 
					
						
							|  |  |  |     a = 1 | 
					
						
							|  |  |  |     b = 2 | 
					
						
							|  |  |  |     c = 3 | 
					
						
							| 
									
										
										
										
											2010-07-30 16:00:46 +00:00
										 |  |  |     (Pdb) continue | 
					
						
							|  |  |  |     BAZ | 
					
						
							|  |  |  |     """
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-04-02 17:15:21 +01:00
										 |  |  | def reset_Breakpoint(): | 
					
						
							|  |  |  |     import bdb | 
					
						
							|  |  |  |     bdb.Breakpoint.clearBreakpoints() | 
					
						
							| 
									
										
										
										
											2010-07-30 16:00:46 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | def test_pdb_breakpoint_commands(): | 
					
						
							|  |  |  |     """Test basic commands related to breakpoints.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     >>> def test_function(): | 
					
						
							| 
									
										
										
										
											2016-09-09 22:21:17 -07:00
										 |  |  |     ...     import pdb; pdb.Pdb(nosigint=True, readrc=False).set_trace() | 
					
						
							| 
									
										
										
										
											2010-07-30 16:00:46 +00:00
										 |  |  |     ...     print(1) | 
					
						
							|  |  |  |     ...     print(2) | 
					
						
							|  |  |  |     ...     print(3) | 
					
						
							|  |  |  |     ...     print(4) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     First, need to clear bdb state that might be left over from previous tests. | 
					
						
							|  |  |  |     Otherwise, the new breakpoints might get assigned different numbers. | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-04-02 17:15:21 +01:00
										 |  |  |     >>> reset_Breakpoint() | 
					
						
							| 
									
										
										
										
											2010-07-30 16:00:46 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     Now test the breakpoint commands.  NORMALIZE_WHITESPACE is needed because | 
					
						
							|  |  |  |     the breakpoint list outputs a tab for the "stop only" and "ignore next" | 
					
						
							|  |  |  |     lines, which we don't want to put in here. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     >>> with PdbTestInput([  # doctest: +NORMALIZE_WHITESPACE | 
					
						
							|  |  |  |     ...     'break 3', | 
					
						
							| 
									
										
										
										
											2023-03-29 03:09:12 -07:00
										 |  |  |     ...     'break 4, +', | 
					
						
							| 
									
										
										
										
											2010-07-30 16:00:46 +00:00
										 |  |  |     ...     'disable 1', | 
					
						
							|  |  |  |     ...     'ignore 1 10', | 
					
						
							|  |  |  |     ...     'condition 1 1 < 2', | 
					
						
							| 
									
										
										
										
											2023-03-29 03:09:12 -07:00
										 |  |  |     ...     'condition 1 1 <', | 
					
						
							| 
									
										
										
										
											2010-07-30 16:00:46 +00:00
										 |  |  |     ...     'break 4', | 
					
						
							| 
									
										
										
										
											2010-11-29 11:54:17 +00:00
										 |  |  |     ...     'break 4', | 
					
						
							|  |  |  |     ...     'break', | 
					
						
							|  |  |  |     ...     'clear 3', | 
					
						
							| 
									
										
										
										
											2010-07-30 16:00:46 +00:00
										 |  |  |     ...     'break', | 
					
						
							|  |  |  |     ...     'condition 1', | 
					
						
							|  |  |  |     ...     'enable 1', | 
					
						
							|  |  |  |     ...     'clear 1', | 
					
						
							|  |  |  |     ...     'commands 2', | 
					
						
							| 
									
										
										
										
											2013-10-10 17:23:26 -04:00
										 |  |  |     ...     'p "42"', | 
					
						
							|  |  |  |     ...     'print("42", 7*6)',     # Issue 18764 (not about breakpoints) | 
					
						
							| 
									
										
										
										
											2010-07-30 16:00:46 +00:00
										 |  |  |     ...     'end', | 
					
						
							|  |  |  |     ...     'continue',  # will stop at breakpoint 2 (line 4) | 
					
						
							|  |  |  |     ...     'clear',     # clear all! | 
					
						
							|  |  |  |     ...     'y', | 
					
						
							|  |  |  |     ...     'tbreak 5', | 
					
						
							|  |  |  |     ...     'continue',  # will stop at temporary breakpoint | 
					
						
							|  |  |  |     ...     'break',     # make sure breakpoint is gone | 
					
						
							| 
									
										
										
										
											2021-07-28 12:55:03 -04:00
										 |  |  |     ...     'commands 10',  # out of range | 
					
						
							|  |  |  |     ...     'commands a',   # display help | 
					
						
							|  |  |  |     ...     'commands 4',   # already deleted | 
					
						
							| 
									
										
										
										
											2023-03-29 03:09:12 -07:00
										 |  |  |     ...     'break 6, undefined', # condition causing `NameError` during evaluation | 
					
						
							|  |  |  |     ...     'continue', # will stop, ignoring runtime error | 
					
						
							| 
									
										
										
										
											2010-07-30 16:00:46 +00:00
										 |  |  |     ...     'continue', | 
					
						
							|  |  |  |     ... ]): | 
					
						
							|  |  |  |     ...    test_function() | 
					
						
							| 
									
										
										
										
											2024-05-05 07:05:01 -07:00
										 |  |  |     > <doctest test.test_pdb.test_pdb_breakpoint_commands[0]>(2)test_function() | 
					
						
							|  |  |  |     -> import pdb; pdb.Pdb(nosigint=True, readrc=False).set_trace() | 
					
						
							| 
									
										
										
										
											2010-07-30 16:00:46 +00:00
										 |  |  |     (Pdb) break 3 | 
					
						
							|  |  |  |     Breakpoint 1 at <doctest test.test_pdb.test_pdb_breakpoint_commands[0]>:3 | 
					
						
							| 
									
										
										
										
											2023-03-29 03:09:12 -07:00
										 |  |  |     (Pdb) break 4, + | 
					
						
							|  |  |  |     *** Invalid condition +: SyntaxError: invalid syntax | 
					
						
							| 
									
										
										
										
											2010-07-30 16:00:46 +00:00
										 |  |  |     (Pdb) disable 1 | 
					
						
							|  |  |  |     Disabled breakpoint 1 at <doctest test.test_pdb.test_pdb_breakpoint_commands[0]>:3 | 
					
						
							|  |  |  |     (Pdb) ignore 1 10 | 
					
						
							|  |  |  |     Will ignore next 10 crossings of breakpoint 1. | 
					
						
							|  |  |  |     (Pdb) condition 1 1 < 2 | 
					
						
							|  |  |  |     New condition set for breakpoint 1. | 
					
						
							| 
									
										
										
										
											2023-03-29 03:09:12 -07:00
										 |  |  |     (Pdb) condition 1 1 < | 
					
						
							|  |  |  |     *** Invalid condition 1 <: SyntaxError: invalid syntax | 
					
						
							| 
									
										
										
										
											2010-07-30 16:00:46 +00:00
										 |  |  |     (Pdb) break 4 | 
					
						
							|  |  |  |     Breakpoint 2 at <doctest test.test_pdb.test_pdb_breakpoint_commands[0]>:4 | 
					
						
							| 
									
										
										
										
											2010-11-29 11:54:17 +00:00
										 |  |  |     (Pdb) break 4 | 
					
						
							|  |  |  |     Breakpoint 3 at <doctest test.test_pdb.test_pdb_breakpoint_commands[0]>:4 | 
					
						
							|  |  |  |     (Pdb) break | 
					
						
							|  |  |  |     Num Type         Disp Enb   Where | 
					
						
							|  |  |  |     1   breakpoint   keep no    at <doctest test.test_pdb.test_pdb_breakpoint_commands[0]>:3 | 
					
						
							|  |  |  |             stop only if 1 < 2 | 
					
						
							|  |  |  |             ignore next 10 hits | 
					
						
							|  |  |  |     2   breakpoint   keep yes   at <doctest test.test_pdb.test_pdb_breakpoint_commands[0]>:4 | 
					
						
							|  |  |  |     3   breakpoint   keep yes   at <doctest test.test_pdb.test_pdb_breakpoint_commands[0]>:4 | 
					
						
							|  |  |  |     (Pdb) clear 3 | 
					
						
							|  |  |  |     Deleted breakpoint 3 at <doctest test.test_pdb.test_pdb_breakpoint_commands[0]>:4 | 
					
						
							| 
									
										
										
										
											2010-07-30 16:00:46 +00:00
										 |  |  |     (Pdb) break | 
					
						
							|  |  |  |     Num Type         Disp Enb   Where | 
					
						
							|  |  |  |     1   breakpoint   keep no    at <doctest test.test_pdb.test_pdb_breakpoint_commands[0]>:3 | 
					
						
							|  |  |  |             stop only if 1 < 2 | 
					
						
							|  |  |  |             ignore next 10 hits | 
					
						
							|  |  |  |     2   breakpoint   keep yes   at <doctest test.test_pdb.test_pdb_breakpoint_commands[0]>:4 | 
					
						
							|  |  |  |     (Pdb) condition 1 | 
					
						
							|  |  |  |     Breakpoint 1 is now unconditional. | 
					
						
							|  |  |  |     (Pdb) enable 1 | 
					
						
							|  |  |  |     Enabled breakpoint 1 at <doctest test.test_pdb.test_pdb_breakpoint_commands[0]>:3 | 
					
						
							|  |  |  |     (Pdb) clear 1 | 
					
						
							|  |  |  |     Deleted breakpoint 1 at <doctest test.test_pdb.test_pdb_breakpoint_commands[0]>:3 | 
					
						
							|  |  |  |     (Pdb) commands 2 | 
					
						
							| 
									
										
										
										
											2013-10-10 17:23:26 -04:00
										 |  |  |     (com) p "42" | 
					
						
							|  |  |  |     (com) print("42", 7*6) | 
					
						
							| 
									
										
										
										
											2010-07-30 16:00:46 +00:00
										 |  |  |     (com) end | 
					
						
							|  |  |  |     (Pdb) continue | 
					
						
							|  |  |  |     1 | 
					
						
							| 
									
										
										
										
											2013-10-10 17:23:26 -04:00
										 |  |  |     '42' | 
					
						
							|  |  |  |     42 42 | 
					
						
							| 
									
										
										
										
											2010-07-30 16:00:46 +00:00
										 |  |  |     > <doctest test.test_pdb.test_pdb_breakpoint_commands[0]>(4)test_function() | 
					
						
							|  |  |  |     -> print(2) | 
					
						
							|  |  |  |     (Pdb) clear | 
					
						
							|  |  |  |     Clear all breaks? y | 
					
						
							|  |  |  |     Deleted breakpoint 2 at <doctest test.test_pdb.test_pdb_breakpoint_commands[0]>:4 | 
					
						
							|  |  |  |     (Pdb) tbreak 5 | 
					
						
							| 
									
										
										
										
											2010-11-29 11:54:17 +00:00
										 |  |  |     Breakpoint 4 at <doctest test.test_pdb.test_pdb_breakpoint_commands[0]>:5 | 
					
						
							| 
									
										
										
										
											2010-07-30 16:00:46 +00:00
										 |  |  |     (Pdb) continue | 
					
						
							|  |  |  |     2 | 
					
						
							| 
									
										
										
										
											2010-11-29 11:54:17 +00:00
										 |  |  |     Deleted breakpoint 4 at <doctest test.test_pdb.test_pdb_breakpoint_commands[0]>:5 | 
					
						
							| 
									
										
										
										
											2010-07-30 16:00:46 +00:00
										 |  |  |     > <doctest test.test_pdb.test_pdb_breakpoint_commands[0]>(5)test_function() | 
					
						
							|  |  |  |     -> print(3) | 
					
						
							|  |  |  |     (Pdb) break | 
					
						
							| 
									
										
										
										
											2021-07-28 12:55:03 -04:00
										 |  |  |     (Pdb) commands 10 | 
					
						
							|  |  |  |     *** cannot set commands: Breakpoint number 10 out of range | 
					
						
							|  |  |  |     (Pdb) commands a | 
					
						
							| 
									
										
										
										
											2023-06-01 04:51:46 +08:00
										 |  |  |     *** Invalid argument: a | 
					
						
							|  |  |  |           Usage: (Pdb) commands [bpnumber] | 
					
						
							|  |  |  |                  (com) ... | 
					
						
							|  |  |  |                  (com) end | 
					
						
							|  |  |  |                  (Pdb) | 
					
						
							| 
									
										
										
										
											2021-07-28 12:55:03 -04:00
										 |  |  |     (Pdb) commands 4 | 
					
						
							|  |  |  |     *** cannot set commands: Breakpoint 4 already deleted | 
					
						
							| 
									
										
										
										
											2023-03-29 03:09:12 -07:00
										 |  |  |     (Pdb) break 6, undefined | 
					
						
							|  |  |  |     Breakpoint 5 at <doctest test.test_pdb.test_pdb_breakpoint_commands[0]>:6 | 
					
						
							| 
									
										
										
										
											2010-07-30 16:00:46 +00:00
										 |  |  |     (Pdb) continue | 
					
						
							|  |  |  |     3 | 
					
						
							| 
									
										
										
										
											2023-03-29 03:09:12 -07:00
										 |  |  |     > <doctest test.test_pdb.test_pdb_breakpoint_commands[0]>(6)test_function() | 
					
						
							|  |  |  |     -> print(4) | 
					
						
							|  |  |  |     (Pdb) continue | 
					
						
							| 
									
										
										
										
											2010-07-30 16:00:46 +00:00
										 |  |  |     4 | 
					
						
							|  |  |  |     """
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-04-30 11:18:01 -07:00
										 |  |  | def test_pdb_breakpoint_with_filename(): | 
					
						
							|  |  |  |     """Breakpoints with filename:lineno
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     >>> def test_function(): | 
					
						
							|  |  |  |     ...     # inspect_fodder2 is a great module as the line number is stable | 
					
						
							|  |  |  |     ...     from test.test_inspect import inspect_fodder2 as mod2 | 
					
						
							|  |  |  |     ...     import pdb; pdb.Pdb(nosigint=True, readrc=False).set_trace() | 
					
						
							|  |  |  |     ...     mod2.func88() | 
					
						
							|  |  |  |     ...     mod2.func114() | 
					
						
							|  |  |  |     ...     # Be a good citizen and clean up the mess | 
					
						
							|  |  |  |     ...     reset_Breakpoint() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     First, need to clear bdb state that might be left over from previous tests. | 
					
						
							|  |  |  |     Otherwise, the new breakpoints might get assigned different numbers. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     >>> reset_Breakpoint() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     >>> with PdbTestInput([  # doctest: +NORMALIZE_WHITESPACE +ELLIPSIS | 
					
						
							|  |  |  |     ...     'break test.test_inspect.inspect_fodder2:90', | 
					
						
							|  |  |  |     ...     'continue', # will stop at func88 | 
					
						
							|  |  |  |     ...     'break test/test_inspect/inspect_fodder2.py:115', | 
					
						
							|  |  |  |     ...     'continue', # will stop at func114 | 
					
						
							|  |  |  |     ...     'continue', | 
					
						
							|  |  |  |     ... ]): | 
					
						
							|  |  |  |     ...    test_function() | 
					
						
							| 
									
										
										
										
											2024-05-05 07:05:01 -07:00
										 |  |  |     > <doctest test.test_pdb.test_pdb_breakpoint_with_filename[0]>(4)test_function() | 
					
						
							|  |  |  |     -> import pdb; pdb.Pdb(nosigint=True, readrc=False).set_trace() | 
					
						
							| 
									
										
										
										
											2024-04-30 11:18:01 -07:00
										 |  |  |     (Pdb) break test.test_inspect.inspect_fodder2:90 | 
					
						
							|  |  |  |     Breakpoint 1 at ...inspect_fodder2.py:90 | 
					
						
							|  |  |  |     (Pdb) continue | 
					
						
							|  |  |  |     > ...inspect_fodder2.py(90)func88() | 
					
						
							|  |  |  |     -> return 90 | 
					
						
							|  |  |  |     (Pdb) break test/test_inspect/inspect_fodder2.py:115 | 
					
						
							|  |  |  |     Breakpoint 2 at ...inspect_fodder2.py:115 | 
					
						
							|  |  |  |     (Pdb) continue | 
					
						
							|  |  |  |     > ...inspect_fodder2.py(115)func114() | 
					
						
							|  |  |  |     -> return 115 | 
					
						
							|  |  |  |     (Pdb) continue | 
					
						
							|  |  |  |     """
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-04-02 17:15:21 +01:00
										 |  |  | def test_pdb_breakpoints_preserved_across_interactive_sessions(): | 
					
						
							|  |  |  |     """Breakpoints are remembered between interactive sessions
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     >>> reset_Breakpoint() | 
					
						
							|  |  |  |     >>> with PdbTestInput([  # doctest: +ELLIPSIS, +NORMALIZE_WHITESPACE | 
					
						
							|  |  |  |     ...    'import test.test_pdb', | 
					
						
							|  |  |  |     ...    'break test.test_pdb.do_something', | 
					
						
							|  |  |  |     ...    'break test.test_pdb.do_nothing', | 
					
						
							|  |  |  |     ...    'break', | 
					
						
							|  |  |  |     ...    'continue', | 
					
						
							|  |  |  |     ... ]): | 
					
						
							|  |  |  |     ...    pdb.run('print()') | 
					
						
							| 
									
										
										
										
											2021-04-04 16:04:53 +01:00
										 |  |  |     > <string>(1)<module>()... | 
					
						
							| 
									
										
										
										
											2021-04-02 17:15:21 +01:00
										 |  |  |     (Pdb) import test.test_pdb | 
					
						
							|  |  |  |     (Pdb) break test.test_pdb.do_something | 
					
						
							|  |  |  |     Breakpoint 1 at ...test_pdb.py:... | 
					
						
							|  |  |  |     (Pdb) break test.test_pdb.do_nothing | 
					
						
							|  |  |  |     Breakpoint 2 at ...test_pdb.py:... | 
					
						
							|  |  |  |     (Pdb) break | 
					
						
							|  |  |  |     Num Type         Disp Enb   Where | 
					
						
							|  |  |  |     1   breakpoint   keep yes   at ...test_pdb.py:... | 
					
						
							|  |  |  |     2   breakpoint   keep yes   at ...test_pdb.py:... | 
					
						
							|  |  |  |     (Pdb) continue | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     >>> with PdbTestInput([  # doctest: +ELLIPSIS, +NORMALIZE_WHITESPACE | 
					
						
							|  |  |  |     ...    'break', | 
					
						
							|  |  |  |     ...    'break pdb.find_function', | 
					
						
							|  |  |  |     ...    'break', | 
					
						
							|  |  |  |     ...    'clear 1', | 
					
						
							|  |  |  |     ...    'continue', | 
					
						
							|  |  |  |     ... ]): | 
					
						
							|  |  |  |     ...    pdb.run('print()') | 
					
						
							| 
									
										
										
										
											2021-04-04 16:04:53 +01:00
										 |  |  |     > <string>(1)<module>()... | 
					
						
							| 
									
										
										
										
											2021-04-02 17:15:21 +01:00
										 |  |  |     (Pdb) break | 
					
						
							|  |  |  |     Num Type         Disp Enb   Where | 
					
						
							|  |  |  |     1   breakpoint   keep yes   at ...test_pdb.py:... | 
					
						
							|  |  |  |     2   breakpoint   keep yes   at ...test_pdb.py:... | 
					
						
							|  |  |  |     (Pdb) break pdb.find_function | 
					
						
							| 
									
										
										
										
											2023-06-15 16:34:42 -07:00
										 |  |  |     Breakpoint 3 at ...pdb.py:... | 
					
						
							| 
									
										
										
										
											2021-04-02 17:15:21 +01:00
										 |  |  |     (Pdb) break | 
					
						
							|  |  |  |     Num Type         Disp Enb   Where | 
					
						
							|  |  |  |     1   breakpoint   keep yes   at ...test_pdb.py:... | 
					
						
							|  |  |  |     2   breakpoint   keep yes   at ...test_pdb.py:... | 
					
						
							|  |  |  |     3   breakpoint   keep yes   at ...pdb.py:... | 
					
						
							|  |  |  |     (Pdb) clear 1 | 
					
						
							|  |  |  |     Deleted breakpoint 1 at ...test_pdb.py:... | 
					
						
							|  |  |  |     (Pdb) continue | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     >>> with PdbTestInput([  # doctest: +ELLIPSIS, +NORMALIZE_WHITESPACE | 
					
						
							|  |  |  |     ...    'break', | 
					
						
							|  |  |  |     ...    'clear 2', | 
					
						
							|  |  |  |     ...    'clear 3', | 
					
						
							|  |  |  |     ...    'continue', | 
					
						
							|  |  |  |     ... ]): | 
					
						
							|  |  |  |     ...    pdb.run('print()') | 
					
						
							| 
									
										
										
										
											2021-04-04 16:04:53 +01:00
										 |  |  |     > <string>(1)<module>()... | 
					
						
							| 
									
										
										
										
											2021-04-02 17:15:21 +01:00
										 |  |  |     (Pdb) break | 
					
						
							|  |  |  |     Num Type         Disp Enb   Where | 
					
						
							|  |  |  |     2   breakpoint   keep yes   at ...test_pdb.py:... | 
					
						
							|  |  |  |     3   breakpoint   keep yes   at ...pdb.py:... | 
					
						
							|  |  |  |     (Pdb) clear 2 | 
					
						
							|  |  |  |     Deleted breakpoint 2 at ...test_pdb.py:... | 
					
						
							|  |  |  |     (Pdb) clear 3 | 
					
						
							|  |  |  |     Deleted breakpoint 3 at ...pdb.py:... | 
					
						
							|  |  |  |     (Pdb) continue | 
					
						
							|  |  |  |     """
 | 
					
						
							| 
									
										
										
										
											2010-07-30 16:00:46 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-06-10 22:32:04 +02:00
										 |  |  | def test_pdb_pp_repr_exc(): | 
					
						
							|  |  |  |     """Test that do_p/do_pp do not swallow exceptions.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     >>> class BadRepr: | 
					
						
							|  |  |  |     ...     def __repr__(self): | 
					
						
							|  |  |  |     ...         raise Exception('repr_exc') | 
					
						
							|  |  |  |     >>> obj = BadRepr() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     >>> def test_function(): | 
					
						
							|  |  |  |     ...     import pdb; pdb.Pdb(nosigint=True, readrc=False).set_trace() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     >>> with PdbTestInput([  # doctest: +NORMALIZE_WHITESPACE | 
					
						
							|  |  |  |     ...     'p obj', | 
					
						
							|  |  |  |     ...     'pp obj', | 
					
						
							|  |  |  |     ...     'continue', | 
					
						
							|  |  |  |     ... ]): | 
					
						
							|  |  |  |     ...    test_function() | 
					
						
							| 
									
										
										
										
											2024-05-05 07:05:01 -07:00
										 |  |  |     > <doctest test.test_pdb.test_pdb_pp_repr_exc[2]>(2)test_function() | 
					
						
							| 
									
										
										
										
											2021-06-10 22:32:04 +02:00
										 |  |  |     -> import pdb; pdb.Pdb(nosigint=True, readrc=False).set_trace() | 
					
						
							|  |  |  |     (Pdb) p obj | 
					
						
							|  |  |  |     *** Exception: repr_exc | 
					
						
							|  |  |  |     (Pdb) pp obj | 
					
						
							|  |  |  |     *** Exception: repr_exc | 
					
						
							|  |  |  |     (Pdb) continue | 
					
						
							|  |  |  |     """
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-07-30 17:04:28 +00:00
										 |  |  | def do_nothing(): | 
					
						
							|  |  |  |     pass | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def do_something(): | 
					
						
							|  |  |  |     print(42) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def test_list_commands(): | 
					
						
							|  |  |  |     """Test the list and source commands of pdb.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     >>> def test_function_2(foo): | 
					
						
							| 
									
										
										
										
											2010-07-31 11:52:46 +00:00
										 |  |  |     ...     import test.test_pdb | 
					
						
							|  |  |  |     ...     test.test_pdb.do_nothing() | 
					
						
							| 
									
										
										
										
											2010-07-30 17:04:28 +00:00
										 |  |  |     ...     'some...' | 
					
						
							|  |  |  |     ...     'more...' | 
					
						
							|  |  |  |     ...     'code...' | 
					
						
							|  |  |  |     ...     'to...' | 
					
						
							|  |  |  |     ...     'make...' | 
					
						
							|  |  |  |     ...     'a...' | 
					
						
							|  |  |  |     ...     'long...' | 
					
						
							|  |  |  |     ...     'listing...' | 
					
						
							|  |  |  |     ...     'useful...' | 
					
						
							|  |  |  |     ...     '...' | 
					
						
							|  |  |  |     ...     '...' | 
					
						
							|  |  |  |     ...     return foo | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     >>> def test_function(): | 
					
						
							| 
									
										
										
										
											2016-09-09 22:21:17 -07:00
										 |  |  |     ...     import pdb; pdb.Pdb(nosigint=True, readrc=False).set_trace() | 
					
						
							| 
									
										
										
										
											2010-07-30 17:04:28 +00:00
										 |  |  |     ...     ret = test_function_2('baz') | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     >>> with PdbTestInput([  # doctest: +ELLIPSIS, +NORMALIZE_WHITESPACE | 
					
						
							| 
									
										
										
										
											2024-05-05 07:05:01 -07:00
										 |  |  |     ...     'step',      # go to the test function line | 
					
						
							| 
									
										
										
										
											2010-07-30 17:04:28 +00:00
										 |  |  |     ...     'list',      # list first function | 
					
						
							|  |  |  |     ...     'step',      # step into second function | 
					
						
							|  |  |  |     ...     'list',      # list second function | 
					
						
							|  |  |  |     ...     'list',      # continue listing to EOF | 
					
						
							|  |  |  |     ...     'list 1,3',  # list specific lines | 
					
						
							|  |  |  |     ...     'list x',    # invalid argument | 
					
						
							|  |  |  |     ...     'next',      # step to import | 
					
						
							|  |  |  |     ...     'next',      # step over import | 
					
						
							|  |  |  |     ...     'step',      # step into do_nothing | 
					
						
							|  |  |  |     ...     'longlist',  # list all lines | 
					
						
							|  |  |  |     ...     'source do_something',  # list all lines of function | 
					
						
							| 
									
										
										
										
											2010-07-30 18:15:16 +00:00
										 |  |  |     ...     'source fooxxx',        # something that doesn't exit | 
					
						
							| 
									
										
										
										
											2010-07-30 17:04:28 +00:00
										 |  |  |     ...     'continue', | 
					
						
							|  |  |  |     ... ]): | 
					
						
							|  |  |  |     ...    test_function() | 
					
						
							| 
									
										
										
										
											2024-05-05 07:05:01 -07:00
										 |  |  |     > <doctest test.test_pdb.test_list_commands[1]>(2)test_function() | 
					
						
							|  |  |  |     -> import pdb; pdb.Pdb(nosigint=True, readrc=False).set_trace() | 
					
						
							|  |  |  |     (Pdb) step | 
					
						
							| 
									
										
										
										
											2010-07-30 17:04:28 +00:00
										 |  |  |     > <doctest test.test_pdb.test_list_commands[1]>(3)test_function() | 
					
						
							|  |  |  |     -> ret = test_function_2('baz') | 
					
						
							|  |  |  |     (Pdb) list | 
					
						
							|  |  |  |       1         def test_function(): | 
					
						
							| 
									
										
										
										
											2016-09-09 22:21:17 -07:00
										 |  |  |       2             import pdb; pdb.Pdb(nosigint=True, readrc=False).set_trace() | 
					
						
							| 
									
										
										
										
											2010-07-30 17:04:28 +00:00
										 |  |  |       3  ->         ret = test_function_2('baz') | 
					
						
							|  |  |  |     [EOF] | 
					
						
							|  |  |  |     (Pdb) step | 
					
						
							|  |  |  |     --Call-- | 
					
						
							|  |  |  |     > <doctest test.test_pdb.test_list_commands[0]>(1)test_function_2() | 
					
						
							|  |  |  |     -> def test_function_2(foo): | 
					
						
							|  |  |  |     (Pdb) list | 
					
						
							|  |  |  |       1  ->     def test_function_2(foo): | 
					
						
							| 
									
										
										
										
											2010-07-31 11:52:46 +00:00
										 |  |  |       2             import test.test_pdb | 
					
						
							|  |  |  |       3             test.test_pdb.do_nothing() | 
					
						
							| 
									
										
										
										
											2010-07-30 17:04:28 +00:00
										 |  |  |       4             'some...' | 
					
						
							|  |  |  |       5             'more...' | 
					
						
							|  |  |  |       6             'code...' | 
					
						
							|  |  |  |       7             'to...' | 
					
						
							|  |  |  |       8             'make...' | 
					
						
							|  |  |  |       9             'a...' | 
					
						
							|  |  |  |      10             'long...' | 
					
						
							|  |  |  |      11             'listing...' | 
					
						
							|  |  |  |     (Pdb) list | 
					
						
							|  |  |  |      12             'useful...' | 
					
						
							|  |  |  |      13             '...' | 
					
						
							|  |  |  |      14             '...' | 
					
						
							|  |  |  |      15             return foo | 
					
						
							|  |  |  |     [EOF] | 
					
						
							|  |  |  |     (Pdb) list 1,3 | 
					
						
							|  |  |  |       1  ->     def test_function_2(foo): | 
					
						
							| 
									
										
										
										
											2010-07-31 11:52:46 +00:00
										 |  |  |       2             import test.test_pdb | 
					
						
							|  |  |  |       3             test.test_pdb.do_nothing() | 
					
						
							| 
									
										
										
										
											2010-07-30 17:04:28 +00:00
										 |  |  |     (Pdb) list x | 
					
						
							|  |  |  |     *** ... | 
					
						
							|  |  |  |     (Pdb) next | 
					
						
							|  |  |  |     > <doctest test.test_pdb.test_list_commands[0]>(2)test_function_2() | 
					
						
							| 
									
										
										
										
											2010-07-31 11:52:46 +00:00
										 |  |  |     -> import test.test_pdb | 
					
						
							| 
									
										
										
										
											2010-07-30 17:04:28 +00:00
										 |  |  |     (Pdb) next | 
					
						
							|  |  |  |     > <doctest test.test_pdb.test_list_commands[0]>(3)test_function_2() | 
					
						
							| 
									
										
										
										
											2010-07-31 11:52:46 +00:00
										 |  |  |     -> test.test_pdb.do_nothing() | 
					
						
							| 
									
										
										
										
											2010-07-30 17:04:28 +00:00
										 |  |  |     (Pdb) step | 
					
						
							|  |  |  |     --Call-- | 
					
						
							| 
									
										
										
										
											2010-07-31 08:14:16 +00:00
										 |  |  |     > ...test_pdb.py(...)do_nothing() | 
					
						
							| 
									
										
										
										
											2010-07-30 17:04:28 +00:00
										 |  |  |     -> def do_nothing(): | 
					
						
							|  |  |  |     (Pdb) longlist | 
					
						
							|  |  |  |     ...  ->     def do_nothing(): | 
					
						
							|  |  |  |     ...             pass | 
					
						
							|  |  |  |     (Pdb) source do_something | 
					
						
							|  |  |  |     ...         def do_something(): | 
					
						
							|  |  |  |     ...             print(42) | 
					
						
							| 
									
										
										
										
											2010-07-30 18:15:16 +00:00
										 |  |  |     (Pdb) source fooxxx | 
					
						
							|  |  |  |     *** ... | 
					
						
							| 
									
										
										
										
											2010-07-30 17:04:28 +00:00
										 |  |  |     (Pdb) continue | 
					
						
							|  |  |  |     """
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-27 01:51:12 +01:00
										 |  |  | def test_pdb_whatis_command(): | 
					
						
							|  |  |  |     """Test the whatis command
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     >>> myvar = (1,2) | 
					
						
							|  |  |  |     >>> def myfunc(): | 
					
						
							|  |  |  |     ...     pass | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     >>> class MyClass: | 
					
						
							|  |  |  |     ...    def mymethod(self): | 
					
						
							|  |  |  |     ...        pass | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     >>> def test_function(): | 
					
						
							|  |  |  |     ...   import pdb; pdb.Pdb(nosigint=True, readrc=False).set_trace() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     >>> with PdbTestInput([  # doctest: +ELLIPSIS, +NORMALIZE_WHITESPACE | 
					
						
							|  |  |  |     ...    'whatis myvar', | 
					
						
							|  |  |  |     ...    'whatis myfunc', | 
					
						
							|  |  |  |     ...    'whatis MyClass', | 
					
						
							|  |  |  |     ...    'whatis MyClass()', | 
					
						
							|  |  |  |     ...    'whatis MyClass.mymethod', | 
					
						
							|  |  |  |     ...    'whatis MyClass().mymethod', | 
					
						
							|  |  |  |     ...    'continue', | 
					
						
							|  |  |  |     ... ]): | 
					
						
							|  |  |  |     ...    test_function() | 
					
						
							| 
									
										
										
										
											2024-05-05 07:05:01 -07:00
										 |  |  |     > <doctest test.test_pdb.test_pdb_whatis_command[3]>(2)test_function() | 
					
						
							| 
									
										
										
										
											2020-08-27 01:51:12 +01:00
										 |  |  |     -> import pdb; pdb.Pdb(nosigint=True, readrc=False).set_trace() | 
					
						
							|  |  |  |     (Pdb) whatis myvar | 
					
						
							|  |  |  |     <class 'tuple'> | 
					
						
							|  |  |  |     (Pdb) whatis myfunc | 
					
						
							|  |  |  |     Function myfunc | 
					
						
							|  |  |  |     (Pdb) whatis MyClass | 
					
						
							|  |  |  |     Class test.test_pdb.MyClass | 
					
						
							|  |  |  |     (Pdb) whatis MyClass() | 
					
						
							|  |  |  |     <class 'test.test_pdb.MyClass'> | 
					
						
							|  |  |  |     (Pdb) whatis MyClass.mymethod | 
					
						
							|  |  |  |     Function mymethod | 
					
						
							|  |  |  |     (Pdb) whatis MyClass().mymethod | 
					
						
							|  |  |  |     Method mymethod | 
					
						
							|  |  |  |     (Pdb) continue | 
					
						
							|  |  |  |     """
 | 
					
						
							| 
									
										
										
										
											2010-07-30 17:04:28 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-03-24 13:50:06 -07:00
										 |  |  | def test_pdb_display_command(): | 
					
						
							|  |  |  |     """Test display command
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     >>> def test_function(): | 
					
						
							|  |  |  |     ...     a = 0 | 
					
						
							|  |  |  |     ...     import pdb; pdb.Pdb(nosigint=True, readrc=False).set_trace() | 
					
						
							|  |  |  |     ...     a = 1 | 
					
						
							|  |  |  |     ...     a = 2 | 
					
						
							|  |  |  |     ...     a = 3 | 
					
						
							|  |  |  |     ...     a = 4 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     >>> with PdbTestInput([  # doctest: +ELLIPSIS | 
					
						
							| 
									
										
										
										
											2024-05-05 07:05:01 -07:00
										 |  |  |     ...     's', | 
					
						
							| 
									
										
										
										
											2023-03-27 13:37:22 -07:00
										 |  |  |     ...     'display +', | 
					
						
							|  |  |  |     ...     'display', | 
					
						
							| 
									
										
										
										
											2023-03-24 13:50:06 -07:00
										 |  |  |     ...     'display a', | 
					
						
							|  |  |  |     ...     'n', | 
					
						
							|  |  |  |     ...     'display', | 
					
						
							|  |  |  |     ...     'undisplay a', | 
					
						
							|  |  |  |     ...     'n', | 
					
						
							|  |  |  |     ...     'display a', | 
					
						
							|  |  |  |     ...     'undisplay', | 
					
						
							|  |  |  |     ...     'display a < 1', | 
					
						
							|  |  |  |     ...     'n', | 
					
						
							| 
									
										
										
										
											2023-03-29 03:09:12 -07:00
										 |  |  |     ...     'display undefined', | 
					
						
							| 
									
										
										
										
											2023-03-24 13:50:06 -07:00
										 |  |  |     ...     'continue', | 
					
						
							|  |  |  |     ... ]): | 
					
						
							|  |  |  |     ...    test_function() | 
					
						
							| 
									
										
										
										
											2024-05-05 07:05:01 -07:00
										 |  |  |     > <doctest test.test_pdb.test_pdb_display_command[0]>(3)test_function() | 
					
						
							|  |  |  |     -> import pdb; pdb.Pdb(nosigint=True, readrc=False).set_trace() | 
					
						
							|  |  |  |     (Pdb) s | 
					
						
							| 
									
										
										
										
											2023-03-24 13:50:06 -07:00
										 |  |  |     > <doctest test.test_pdb.test_pdb_display_command[0]>(4)test_function() | 
					
						
							|  |  |  |     -> a = 1 | 
					
						
							| 
									
										
										
										
											2023-03-27 13:37:22 -07:00
										 |  |  |     (Pdb) display + | 
					
						
							| 
									
										
										
										
											2023-03-29 03:09:12 -07:00
										 |  |  |     *** Unable to display +: SyntaxError: invalid syntax | 
					
						
							| 
									
										
										
										
											2023-03-27 13:37:22 -07:00
										 |  |  |     (Pdb) display | 
					
						
							|  |  |  |     No expression is being displayed | 
					
						
							| 
									
										
										
										
											2023-03-24 13:50:06 -07:00
										 |  |  |     (Pdb) display a | 
					
						
							|  |  |  |     display a: 0 | 
					
						
							|  |  |  |     (Pdb) n | 
					
						
							|  |  |  |     > <doctest test.test_pdb.test_pdb_display_command[0]>(5)test_function() | 
					
						
							|  |  |  |     -> a = 2 | 
					
						
							|  |  |  |     display a: 1  [old: 0] | 
					
						
							|  |  |  |     (Pdb) display | 
					
						
							|  |  |  |     Currently displaying: | 
					
						
							|  |  |  |     a: 1 | 
					
						
							|  |  |  |     (Pdb) undisplay a | 
					
						
							|  |  |  |     (Pdb) n | 
					
						
							|  |  |  |     > <doctest test.test_pdb.test_pdb_display_command[0]>(6)test_function() | 
					
						
							|  |  |  |     -> a = 3 | 
					
						
							|  |  |  |     (Pdb) display a | 
					
						
							|  |  |  |     display a: 2 | 
					
						
							|  |  |  |     (Pdb) undisplay | 
					
						
							|  |  |  |     (Pdb) display a < 1 | 
					
						
							|  |  |  |     display a < 1: False | 
					
						
							|  |  |  |     (Pdb) n | 
					
						
							|  |  |  |     > <doctest test.test_pdb.test_pdb_display_command[0]>(7)test_function() | 
					
						
							|  |  |  |     -> a = 4 | 
					
						
							| 
									
										
										
										
											2023-03-29 03:09:12 -07:00
										 |  |  |     (Pdb) display undefined | 
					
						
							|  |  |  |     display undefined: ** raised NameError: name 'undefined' is not defined ** | 
					
						
							| 
									
										
										
										
											2023-03-24 13:50:06 -07:00
										 |  |  |     (Pdb) continue | 
					
						
							|  |  |  |     """
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def test_pdb_alias_command(): | 
					
						
							|  |  |  |     """Test alias command
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     >>> class A: | 
					
						
							|  |  |  |     ...     def __init__(self): | 
					
						
							|  |  |  |     ...         self.attr1 = 10 | 
					
						
							|  |  |  |     ...         self.attr2 = 'str' | 
					
						
							|  |  |  |     ...     def method(self): | 
					
						
							|  |  |  |     ...         pass | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     >>> def test_function(): | 
					
						
							|  |  |  |     ...     o = A() | 
					
						
							|  |  |  |     ...     import pdb; pdb.Pdb(nosigint=True, readrc=False).set_trace() | 
					
						
							|  |  |  |     ...     o.method() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     >>> with PdbTestInput([  # doctest: +ELLIPSIS | 
					
						
							| 
									
										
										
										
											2024-05-05 07:05:01 -07:00
										 |  |  |     ...     's', | 
					
						
							| 
									
										
										
										
											2023-09-14 23:31:30 +02:00
										 |  |  |     ...     'alias pi', | 
					
						
							| 
									
										
										
										
											2023-03-24 13:50:06 -07:00
										 |  |  |     ...     'alias pi for k in %1.__dict__.keys(): print(f"%1.{k} = {%1.__dict__[k]}")', | 
					
						
							|  |  |  |     ...     'alias ps pi self', | 
					
						
							| 
									
										
										
										
											2023-09-14 23:31:30 +02:00
										 |  |  |     ...     'alias ps', | 
					
						
							| 
									
										
										
										
											2023-03-24 13:50:06 -07:00
										 |  |  |     ...     'pi o', | 
					
						
							|  |  |  |     ...     's', | 
					
						
							|  |  |  |     ...     'ps', | 
					
						
							| 
									
										
										
										
											2023-11-04 16:05:22 -07:00
										 |  |  |     ...     'alias myp p %2', | 
					
						
							|  |  |  |     ...     'alias myp', | 
					
						
							|  |  |  |     ...     'alias myp p %1', | 
					
						
							|  |  |  |     ...     'myp', | 
					
						
							|  |  |  |     ...     'myp 1', | 
					
						
							|  |  |  |     ...     'myp 1 2', | 
					
						
							|  |  |  |     ...     'alias repeat_second_arg p "%* %2"', | 
					
						
							|  |  |  |     ...     'repeat_second_arg 1 2 3', | 
					
						
							| 
									
										
										
										
											2023-03-24 13:50:06 -07:00
										 |  |  |     ...     'continue', | 
					
						
							|  |  |  |     ... ]): | 
					
						
							|  |  |  |     ...    test_function() | 
					
						
							| 
									
										
										
										
											2024-05-05 07:05:01 -07:00
										 |  |  |     > <doctest test.test_pdb.test_pdb_alias_command[1]>(3)test_function() | 
					
						
							|  |  |  |     -> import pdb; pdb.Pdb(nosigint=True, readrc=False).set_trace() | 
					
						
							|  |  |  |     (Pdb) s | 
					
						
							| 
									
										
										
										
											2023-03-24 13:50:06 -07:00
										 |  |  |     > <doctest test.test_pdb.test_pdb_alias_command[1]>(4)test_function() | 
					
						
							|  |  |  |     -> o.method() | 
					
						
							| 
									
										
										
										
											2023-09-14 23:31:30 +02:00
										 |  |  |     (Pdb) alias pi | 
					
						
							|  |  |  |     *** Unknown alias 'pi' | 
					
						
							| 
									
										
										
										
											2023-03-24 13:50:06 -07:00
										 |  |  |     (Pdb) alias pi for k in %1.__dict__.keys(): print(f"%1.{k} = {%1.__dict__[k]}") | 
					
						
							|  |  |  |     (Pdb) alias ps pi self | 
					
						
							| 
									
										
										
										
											2023-09-14 23:31:30 +02:00
										 |  |  |     (Pdb) alias ps | 
					
						
							|  |  |  |     ps = pi self | 
					
						
							| 
									
										
										
										
											2023-03-24 13:50:06 -07:00
										 |  |  |     (Pdb) pi o | 
					
						
							|  |  |  |     o.attr1 = 10 | 
					
						
							|  |  |  |     o.attr2 = str | 
					
						
							|  |  |  |     (Pdb) s | 
					
						
							|  |  |  |     --Call-- | 
					
						
							|  |  |  |     > <doctest test.test_pdb.test_pdb_alias_command[0]>(5)method() | 
					
						
							|  |  |  |     -> def method(self): | 
					
						
							|  |  |  |     (Pdb) ps | 
					
						
							|  |  |  |     self.attr1 = 10 | 
					
						
							|  |  |  |     self.attr2 = str | 
					
						
							| 
									
										
										
										
											2023-11-04 16:05:22 -07:00
										 |  |  |     (Pdb) alias myp p %2 | 
					
						
							|  |  |  |     *** Replaceable parameters must be consecutive | 
					
						
							|  |  |  |     (Pdb) alias myp | 
					
						
							|  |  |  |     *** Unknown alias 'myp' | 
					
						
							|  |  |  |     (Pdb) alias myp p %1 | 
					
						
							|  |  |  |     (Pdb) myp | 
					
						
							|  |  |  |     *** Not enough arguments for alias 'myp' | 
					
						
							|  |  |  |     (Pdb) myp 1 | 
					
						
							|  |  |  |     1 | 
					
						
							|  |  |  |     (Pdb) myp 1 2 | 
					
						
							|  |  |  |     *** Too many arguments for alias 'myp' | 
					
						
							|  |  |  |     (Pdb) alias repeat_second_arg p "%* %2" | 
					
						
							|  |  |  |     (Pdb) repeat_second_arg 1 2 3 | 
					
						
							|  |  |  |     '1 2 3 2' | 
					
						
							| 
									
										
										
										
											2023-03-24 13:50:06 -07:00
										 |  |  |     (Pdb) continue | 
					
						
							|  |  |  |     """
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def test_pdb_where_command(): | 
					
						
							|  |  |  |     """Test where command
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     >>> def g(): | 
					
						
							|  |  |  |     ...     import pdb; pdb.Pdb(nosigint=True, readrc=False).set_trace() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     >>> def f(): | 
					
						
							| 
									
										
										
										
											2024-06-14 11:25:23 -07:00
										 |  |  |     ...     g() | 
					
						
							| 
									
										
										
										
											2023-03-24 13:50:06 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |     >>> def test_function(): | 
					
						
							|  |  |  |     ...     f() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     >>> with PdbTestInput([  # doctest: +ELLIPSIS | 
					
						
							|  |  |  |     ...     'w', | 
					
						
							|  |  |  |     ...     'where', | 
					
						
							| 
									
										
										
										
											2024-06-14 11:25:23 -07:00
										 |  |  |     ...     'w 1', | 
					
						
							|  |  |  |     ...     'w invalid', | 
					
						
							| 
									
										
										
										
											2023-03-24 13:50:06 -07:00
										 |  |  |     ...     'u', | 
					
						
							|  |  |  |     ...     'w', | 
					
						
							| 
									
										
										
										
											2024-06-14 11:25:23 -07:00
										 |  |  |     ...     'w 0', | 
					
						
							|  |  |  |     ...     'w 100', | 
					
						
							|  |  |  |     ...     'w -100', | 
					
						
							| 
									
										
										
										
											2023-03-24 13:50:06 -07:00
										 |  |  |     ...     'continue', | 
					
						
							|  |  |  |     ... ]): | 
					
						
							|  |  |  |     ...    test_function() | 
					
						
							| 
									
										
										
										
											2024-05-05 07:05:01 -07:00
										 |  |  |     > <doctest test.test_pdb.test_pdb_where_command[0]>(2)g() | 
					
						
							| 
									
										
										
										
											2023-03-24 13:50:06 -07:00
										 |  |  |     -> import pdb; pdb.Pdb(nosigint=True, readrc=False).set_trace() | 
					
						
							|  |  |  |     (Pdb) w | 
					
						
							|  |  |  |     ... | 
					
						
							| 
									
										
										
										
											2024-06-14 11:25:23 -07:00
										 |  |  |       <doctest test.test_pdb.test_pdb_where_command[3]>(13)<module>() | 
					
						
							| 
									
										
										
										
											2023-03-24 13:50:06 -07:00
										 |  |  |     -> test_function() | 
					
						
							|  |  |  |       <doctest test.test_pdb.test_pdb_where_command[2]>(2)test_function() | 
					
						
							|  |  |  |     -> f() | 
					
						
							|  |  |  |       <doctest test.test_pdb.test_pdb_where_command[1]>(2)f() | 
					
						
							| 
									
										
										
										
											2024-06-14 11:25:23 -07:00
										 |  |  |     -> g() | 
					
						
							| 
									
										
										
										
											2024-05-05 07:05:01 -07:00
										 |  |  |     > <doctest test.test_pdb.test_pdb_where_command[0]>(2)g() | 
					
						
							| 
									
										
										
										
											2023-03-24 13:50:06 -07:00
										 |  |  |     -> import pdb; pdb.Pdb(nosigint=True, readrc=False).set_trace() | 
					
						
							|  |  |  |     (Pdb) where | 
					
						
							|  |  |  |     ... | 
					
						
							| 
									
										
										
										
											2024-06-14 11:25:23 -07:00
										 |  |  |       <doctest test.test_pdb.test_pdb_where_command[3]>(13)<module>() | 
					
						
							| 
									
										
										
										
											2023-03-24 13:50:06 -07:00
										 |  |  |     -> test_function() | 
					
						
							|  |  |  |       <doctest test.test_pdb.test_pdb_where_command[2]>(2)test_function() | 
					
						
							|  |  |  |     -> f() | 
					
						
							|  |  |  |       <doctest test.test_pdb.test_pdb_where_command[1]>(2)f() | 
					
						
							| 
									
										
										
										
											2024-06-14 11:25:23 -07:00
										 |  |  |     -> g() | 
					
						
							| 
									
										
										
										
											2024-05-05 07:05:01 -07:00
										 |  |  |     > <doctest test.test_pdb.test_pdb_where_command[0]>(2)g() | 
					
						
							| 
									
										
										
										
											2023-03-24 13:50:06 -07:00
										 |  |  |     -> import pdb; pdb.Pdb(nosigint=True, readrc=False).set_trace() | 
					
						
							| 
									
										
										
										
											2024-06-14 11:25:23 -07:00
										 |  |  |     (Pdb) w 1 | 
					
						
							|  |  |  |     > <doctest test.test_pdb.test_pdb_where_command[0]>(2)g() | 
					
						
							|  |  |  |     -> import pdb; pdb.Pdb(nosigint=True, readrc=False).set_trace() | 
					
						
							|  |  |  |     (Pdb) w invalid | 
					
						
							|  |  |  |     *** Invalid count (invalid) | 
					
						
							| 
									
										
										
										
											2023-03-24 13:50:06 -07:00
										 |  |  |     (Pdb) u | 
					
						
							|  |  |  |     > <doctest test.test_pdb.test_pdb_where_command[1]>(2)f() | 
					
						
							| 
									
										
										
										
											2024-06-14 11:25:23 -07:00
										 |  |  |     -> g() | 
					
						
							| 
									
										
										
										
											2023-03-24 13:50:06 -07:00
										 |  |  |     (Pdb) w | 
					
						
							|  |  |  |     ... | 
					
						
							| 
									
										
										
										
											2024-06-14 11:25:23 -07:00
										 |  |  |       <doctest test.test_pdb.test_pdb_where_command[3]>(13)<module>() | 
					
						
							|  |  |  |     -> test_function() | 
					
						
							|  |  |  |       <doctest test.test_pdb.test_pdb_where_command[2]>(2)test_function() | 
					
						
							|  |  |  |     -> f() | 
					
						
							|  |  |  |     > <doctest test.test_pdb.test_pdb_where_command[1]>(2)f() | 
					
						
							|  |  |  |     -> g() | 
					
						
							|  |  |  |       <doctest test.test_pdb.test_pdb_where_command[0]>(2)g() | 
					
						
							|  |  |  |     -> import pdb; pdb.Pdb(nosigint=True, readrc=False).set_trace() | 
					
						
							|  |  |  |     (Pdb) w 0 | 
					
						
							|  |  |  |     > <doctest test.test_pdb.test_pdb_where_command[1]>(2)f() | 
					
						
							|  |  |  |     -> g() | 
					
						
							|  |  |  |     (Pdb) w 100 | 
					
						
							|  |  |  |     ... | 
					
						
							|  |  |  |       <doctest test.test_pdb.test_pdb_where_command[3]>(13)<module>() | 
					
						
							|  |  |  |     -> test_function() | 
					
						
							|  |  |  |       <doctest test.test_pdb.test_pdb_where_command[2]>(2)test_function() | 
					
						
							|  |  |  |     -> f() | 
					
						
							|  |  |  |     > <doctest test.test_pdb.test_pdb_where_command[1]>(2)f() | 
					
						
							|  |  |  |     -> g() | 
					
						
							|  |  |  |       <doctest test.test_pdb.test_pdb_where_command[0]>(2)g() | 
					
						
							|  |  |  |     -> import pdb; pdb.Pdb(nosigint=True, readrc=False).set_trace() | 
					
						
							|  |  |  |     (Pdb) w -100 | 
					
						
							|  |  |  |     ... | 
					
						
							|  |  |  |       <doctest test.test_pdb.test_pdb_where_command[3]>(13)<module>() | 
					
						
							| 
									
										
										
										
											2023-03-24 13:50:06 -07:00
										 |  |  |     -> test_function() | 
					
						
							|  |  |  |       <doctest test.test_pdb.test_pdb_where_command[2]>(2)test_function() | 
					
						
							|  |  |  |     -> f() | 
					
						
							|  |  |  |     > <doctest test.test_pdb.test_pdb_where_command[1]>(2)f() | 
					
						
							| 
									
										
										
										
											2024-06-14 11:25:23 -07:00
										 |  |  |     -> g() | 
					
						
							| 
									
										
										
										
											2024-05-05 07:05:01 -07:00
										 |  |  |       <doctest test.test_pdb.test_pdb_where_command[0]>(2)g() | 
					
						
							| 
									
										
										
										
											2023-03-24 13:50:06 -07:00
										 |  |  |     -> import pdb; pdb.Pdb(nosigint=True, readrc=False).set_trace() | 
					
						
							|  |  |  |     (Pdb) continue | 
					
						
							|  |  |  |     """
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-12-07 02:19:33 -09:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-02-05 08:04:57 +08:00
										 |  |  | # skip this test if sys.flags.no_site = True; | 
					
						
							|  |  |  | # exit() isn't defined unless there's a site module. | 
					
						
							|  |  |  | if not sys.flags.no_site: | 
					
						
							|  |  |  |     def test_pdb_interact_command(): | 
					
						
							|  |  |  |         """Test interact command
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         >>> g = 0 | 
					
						
							|  |  |  |         >>> dict_g = {} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         >>> def test_function(): | 
					
						
							|  |  |  |         ...     x = 1 | 
					
						
							|  |  |  |         ...     lst_local = [] | 
					
						
							|  |  |  |         ...     import pdb; pdb.Pdb(nosigint=True, readrc=False).set_trace() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         >>> with PdbTestInput([  # doctest: +ELLIPSIS, +NORMALIZE_WHITESPACE | 
					
						
							|  |  |  |         ...     'interact', | 
					
						
							|  |  |  |         ...     'x', | 
					
						
							|  |  |  |         ...     'g', | 
					
						
							|  |  |  |         ...     'x = 2', | 
					
						
							|  |  |  |         ...     'g = 3', | 
					
						
							|  |  |  |         ...     'dict_g["a"] = True', | 
					
						
							|  |  |  |         ...     'lst_local.append(x)', | 
					
						
							|  |  |  |         ...     'exit()', | 
					
						
							|  |  |  |         ...     'p x', | 
					
						
							|  |  |  |         ...     'p g', | 
					
						
							|  |  |  |         ...     'p dict_g', | 
					
						
							|  |  |  |         ...     'p lst_local', | 
					
						
							|  |  |  |         ...     'continue', | 
					
						
							|  |  |  |         ... ]): | 
					
						
							|  |  |  |         ...    test_function() | 
					
						
							| 
									
										
										
										
											2024-05-05 07:05:01 -07:00
										 |  |  |         > <doctest test.test_pdb.test_pdb_interact_command[2]>(4)test_function() | 
					
						
							| 
									
										
										
										
											2024-02-05 08:04:57 +08:00
										 |  |  |         -> import pdb; pdb.Pdb(nosigint=True, readrc=False).set_trace() | 
					
						
							|  |  |  |         (Pdb) interact | 
					
						
							|  |  |  |         *pdb interact start* | 
					
						
							|  |  |  |         ... x | 
					
						
							|  |  |  |         1 | 
					
						
							|  |  |  |         ... g | 
					
						
							|  |  |  |         0 | 
					
						
							|  |  |  |         ... x = 2 | 
					
						
							|  |  |  |         ... g = 3 | 
					
						
							|  |  |  |         ... dict_g["a"] = True | 
					
						
							|  |  |  |         ... lst_local.append(x) | 
					
						
							|  |  |  |         ... exit() | 
					
						
							|  |  |  |         *exit from pdb interact command* | 
					
						
							|  |  |  |         (Pdb) p x | 
					
						
							|  |  |  |         1 | 
					
						
							|  |  |  |         (Pdb) p g | 
					
						
							|  |  |  |         0 | 
					
						
							|  |  |  |         (Pdb) p dict_g | 
					
						
							|  |  |  |         {'a': True} | 
					
						
							|  |  |  |         (Pdb) p lst_local | 
					
						
							|  |  |  |         [2] | 
					
						
							|  |  |  |         (Pdb) continue | 
					
						
							|  |  |  |         """
 | 
					
						
							| 
									
										
										
										
											2023-12-07 02:19:33 -09:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-05-03 07:04:50 -07:00
										 |  |  | def test_convenience_variables(): | 
					
						
							|  |  |  |     """Test convenience variables
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     >>> def util_function(): | 
					
						
							|  |  |  |     ...     import pdb; pdb.Pdb(nosigint=True, readrc=False).set_trace() | 
					
						
							|  |  |  |     ...     try: | 
					
						
							|  |  |  |     ...         raise Exception('test') | 
					
						
							|  |  |  |     ...     except: | 
					
						
							|  |  |  |     ...         pass | 
					
						
							|  |  |  |     ...     return 1 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     >>> def test_function(): | 
					
						
							|  |  |  |     ...     util_function() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     >>> with PdbTestInput([  # doctest: +ELLIPSIS, +NORMALIZE_WHITESPACE | 
					
						
							| 
									
										
										
										
											2024-05-05 07:05:01 -07:00
										 |  |  |     ...     'step',             # Step to try statement | 
					
						
							| 
									
										
										
										
											2023-05-03 07:04:50 -07:00
										 |  |  |     ...     '$_frame.f_lineno', # Check frame convenience variable | 
					
						
							| 
									
										
										
										
											2024-01-17 06:50:31 -08:00
										 |  |  |     ...     '$ _frame',         # This should be a syntax error | 
					
						
							| 
									
										
										
										
											2023-05-03 07:04:50 -07:00
										 |  |  |     ...     '$a = 10',          # Set a convenience variable | 
					
						
							|  |  |  |     ...     '$a',               # Print its value | 
					
						
							| 
									
										
										
										
											2024-01-17 06:50:31 -08:00
										 |  |  |     ...     'p "$a"',           # Print the string $a | 
					
						
							| 
									
										
										
										
											2023-05-03 07:04:50 -07:00
										 |  |  |     ...     'p $a + 2',         # Do some calculation | 
					
						
							| 
									
										
										
										
											2024-01-17 06:50:31 -08:00
										 |  |  |     ...     'p f"$a = {$a}"',   # Make sure $ in string is not converted and f-string works | 
					
						
							| 
									
										
										
										
											2023-05-03 07:04:50 -07:00
										 |  |  |     ...     'u',                # Switch frame | 
					
						
							|  |  |  |     ...     '$_frame.f_lineno', # Make sure the frame changed | 
					
						
							|  |  |  |     ...     '$a',               # Make sure the value persists | 
					
						
							|  |  |  |     ...     'd',                # Go back to the original frame | 
					
						
							|  |  |  |     ...     'next', | 
					
						
							|  |  |  |     ...     '$a',               # The value should be gone | 
					
						
							|  |  |  |     ...     'next', | 
					
						
							|  |  |  |     ...     '$_exception',      # Check exception convenience variable | 
					
						
							|  |  |  |     ...     'next', | 
					
						
							|  |  |  |     ...     '$_exception',      # Exception should be gone | 
					
						
							|  |  |  |     ...     'return', | 
					
						
							|  |  |  |     ...     '$_retval',         # Check return convenience variable | 
					
						
							|  |  |  |     ...     'continue', | 
					
						
							|  |  |  |     ... ]): | 
					
						
							|  |  |  |     ...     test_function() | 
					
						
							| 
									
										
										
										
											2024-05-05 07:05:01 -07:00
										 |  |  |     > <doctest test.test_pdb.test_convenience_variables[0]>(2)util_function() | 
					
						
							|  |  |  |     -> import pdb; pdb.Pdb(nosigint=True, readrc=False).set_trace() | 
					
						
							|  |  |  |     (Pdb) step | 
					
						
							| 
									
										
										
										
											2023-05-03 07:04:50 -07:00
										 |  |  |     > <doctest test.test_pdb.test_convenience_variables[0]>(3)util_function() | 
					
						
							|  |  |  |     -> try: | 
					
						
							|  |  |  |     (Pdb) $_frame.f_lineno | 
					
						
							|  |  |  |     3 | 
					
						
							| 
									
										
										
										
											2024-01-17 06:50:31 -08:00
										 |  |  |     (Pdb) $ _frame | 
					
						
							|  |  |  |     *** SyntaxError: invalid syntax | 
					
						
							| 
									
										
										
										
											2023-05-03 07:04:50 -07:00
										 |  |  |     (Pdb) $a = 10 | 
					
						
							|  |  |  |     (Pdb) $a | 
					
						
							|  |  |  |     10 | 
					
						
							| 
									
										
										
										
											2024-01-17 06:50:31 -08:00
										 |  |  |     (Pdb) p "$a" | 
					
						
							|  |  |  |     '$a' | 
					
						
							| 
									
										
										
										
											2023-05-03 07:04:50 -07:00
										 |  |  |     (Pdb) p $a + 2 | 
					
						
							|  |  |  |     12 | 
					
						
							| 
									
										
										
										
											2024-01-17 06:50:31 -08:00
										 |  |  |     (Pdb) p f"$a = {$a}" | 
					
						
							|  |  |  |     '$a = 10' | 
					
						
							| 
									
										
										
										
											2023-05-03 07:04:50 -07:00
										 |  |  |     (Pdb) u | 
					
						
							|  |  |  |     > <doctest test.test_pdb.test_convenience_variables[1]>(2)test_function() | 
					
						
							|  |  |  |     -> util_function() | 
					
						
							|  |  |  |     (Pdb) $_frame.f_lineno | 
					
						
							|  |  |  |     2 | 
					
						
							|  |  |  |     (Pdb) $a | 
					
						
							|  |  |  |     10 | 
					
						
							|  |  |  |     (Pdb) d | 
					
						
							|  |  |  |     > <doctest test.test_pdb.test_convenience_variables[0]>(3)util_function() | 
					
						
							|  |  |  |     -> try: | 
					
						
							|  |  |  |     (Pdb) next | 
					
						
							|  |  |  |     > <doctest test.test_pdb.test_convenience_variables[0]>(4)util_function() | 
					
						
							|  |  |  |     -> raise Exception('test') | 
					
						
							|  |  |  |     (Pdb) $a | 
					
						
							|  |  |  |     *** KeyError: 'a' | 
					
						
							|  |  |  |     (Pdb) next | 
					
						
							|  |  |  |     Exception: test | 
					
						
							|  |  |  |     > <doctest test.test_pdb.test_convenience_variables[0]>(4)util_function() | 
					
						
							|  |  |  |     -> raise Exception('test') | 
					
						
							|  |  |  |     (Pdb) $_exception | 
					
						
							|  |  |  |     Exception('test') | 
					
						
							|  |  |  |     (Pdb) next | 
					
						
							|  |  |  |     > <doctest test.test_pdb.test_convenience_variables[0]>(5)util_function() | 
					
						
							|  |  |  |     -> except: | 
					
						
							|  |  |  |     (Pdb) $_exception | 
					
						
							|  |  |  |     *** KeyError: '_exception' | 
					
						
							|  |  |  |     (Pdb) return | 
					
						
							|  |  |  |     --Return-- | 
					
						
							|  |  |  |     > <doctest test.test_pdb.test_convenience_variables[0]>(7)util_function()->1 | 
					
						
							|  |  |  |     -> return 1 | 
					
						
							|  |  |  |     (Pdb) $_retval | 
					
						
							|  |  |  |     1 | 
					
						
							|  |  |  |     (Pdb) continue | 
					
						
							|  |  |  |     """
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-08-28 20:31:03 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | def test_post_mortem_chained(): | 
					
						
							|  |  |  |     """Test post mortem traceback debugging of chained exception
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     >>> def test_function_2(): | 
					
						
							|  |  |  |     ...     try: | 
					
						
							|  |  |  |     ...         1/0 | 
					
						
							|  |  |  |     ...     finally: | 
					
						
							|  |  |  |     ...         print('Exception!') | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     >>> def test_function_reraise(): | 
					
						
							|  |  |  |     ...     try: | 
					
						
							|  |  |  |     ...         test_function_2() | 
					
						
							|  |  |  |     ...     except ZeroDivisionError as e: | 
					
						
							|  |  |  |     ...         raise ZeroDivisionError('reraised') from e | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     >>> def test_function(): | 
					
						
							|  |  |  |     ...     import pdb; | 
					
						
							|  |  |  |     ...     instance = pdb.Pdb(nosigint=True, readrc=False) | 
					
						
							|  |  |  |     ...     try: | 
					
						
							|  |  |  |     ...         test_function_reraise() | 
					
						
							|  |  |  |     ...     except Exception as e: | 
					
						
							| 
									
										
										
										
											2023-09-06 11:41:56 +02:00
										 |  |  |     ...         pdb._post_mortem(e, instance) | 
					
						
							| 
									
										
										
										
											2023-08-28 20:31:03 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     >>> with PdbTestInput([  # doctest: +ELLIPSIS, +NORMALIZE_WHITESPACE | 
					
						
							|  |  |  |     ...     'exceptions', | 
					
						
							|  |  |  |     ...     'exceptions 0', | 
					
						
							| 
									
										
										
										
											2023-10-09 01:17:24 -07:00
										 |  |  |     ...     '$_exception', | 
					
						
							| 
									
										
										
										
											2023-08-28 20:31:03 +02:00
										 |  |  |     ...     'up', | 
					
						
							|  |  |  |     ...     'down', | 
					
						
							|  |  |  |     ...     'exceptions 1', | 
					
						
							| 
									
										
										
										
											2023-10-09 01:17:24 -07:00
										 |  |  |     ...     '$_exception', | 
					
						
							| 
									
										
										
										
											2023-08-28 20:31:03 +02:00
										 |  |  |     ...     'up', | 
					
						
							|  |  |  |     ...     'down', | 
					
						
							|  |  |  |     ...     'exceptions -1', | 
					
						
							|  |  |  |     ...     'exceptions 3', | 
					
						
							|  |  |  |     ...     'up', | 
					
						
							|  |  |  |     ...     'exit', | 
					
						
							|  |  |  |     ... ]): | 
					
						
							|  |  |  |     ...    try: | 
					
						
							|  |  |  |     ...        test_function() | 
					
						
							|  |  |  |     ...    except ZeroDivisionError: | 
					
						
							|  |  |  |     ...        print('Correctly reraised.') | 
					
						
							|  |  |  |     Exception! | 
					
						
							|  |  |  |     > <doctest test.test_pdb.test_post_mortem_chained[1]>(5)test_function_reraise() | 
					
						
							|  |  |  |     -> raise ZeroDivisionError('reraised') from e | 
					
						
							|  |  |  |     (Pdb) exceptions | 
					
						
							|  |  |  |       0 ZeroDivisionError('division by zero') | 
					
						
							|  |  |  |     > 1 ZeroDivisionError('reraised') | 
					
						
							|  |  |  |     (Pdb) exceptions 0 | 
					
						
							|  |  |  |     > <doctest test.test_pdb.test_post_mortem_chained[0]>(3)test_function_2() | 
					
						
							|  |  |  |     -> 1/0 | 
					
						
							| 
									
										
										
										
											2023-10-09 01:17:24 -07:00
										 |  |  |     (Pdb) $_exception | 
					
						
							|  |  |  |     ZeroDivisionError('division by zero') | 
					
						
							| 
									
										
										
										
											2023-08-28 20:31:03 +02:00
										 |  |  |     (Pdb) up | 
					
						
							|  |  |  |     > <doctest test.test_pdb.test_post_mortem_chained[1]>(3)test_function_reraise() | 
					
						
							|  |  |  |     -> test_function_2() | 
					
						
							|  |  |  |     (Pdb) down | 
					
						
							|  |  |  |     > <doctest test.test_pdb.test_post_mortem_chained[0]>(3)test_function_2() | 
					
						
							|  |  |  |     -> 1/0 | 
					
						
							|  |  |  |     (Pdb) exceptions 1 | 
					
						
							|  |  |  |     > <doctest test.test_pdb.test_post_mortem_chained[1]>(5)test_function_reraise() | 
					
						
							|  |  |  |     -> raise ZeroDivisionError('reraised') from e | 
					
						
							| 
									
										
										
										
											2023-10-09 01:17:24 -07:00
										 |  |  |     (Pdb) $_exception | 
					
						
							|  |  |  |     ZeroDivisionError('reraised') | 
					
						
							| 
									
										
										
										
											2023-08-28 20:31:03 +02:00
										 |  |  |     (Pdb) up | 
					
						
							|  |  |  |     > <doctest test.test_pdb.test_post_mortem_chained[2]>(5)test_function() | 
					
						
							|  |  |  |     -> test_function_reraise() | 
					
						
							|  |  |  |     (Pdb) down | 
					
						
							|  |  |  |     > <doctest test.test_pdb.test_post_mortem_chained[1]>(5)test_function_reraise() | 
					
						
							|  |  |  |     -> raise ZeroDivisionError('reraised') from e | 
					
						
							|  |  |  |     (Pdb) exceptions -1 | 
					
						
							|  |  |  |     *** No exception with that number | 
					
						
							|  |  |  |     (Pdb) exceptions 3 | 
					
						
							|  |  |  |     *** No exception with that number | 
					
						
							|  |  |  |     (Pdb) up | 
					
						
							|  |  |  |     > <doctest test.test_pdb.test_post_mortem_chained[2]>(5)test_function() | 
					
						
							|  |  |  |     -> test_function_reraise() | 
					
						
							|  |  |  |     (Pdb) exit | 
					
						
							|  |  |  |     """
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def test_post_mortem_cause_no_context(): | 
					
						
							|  |  |  |     """Test post mortem traceback debugging of chained exception
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-09-06 11:41:56 +02:00
										 |  |  |     >>> def make_exc_with_stack(type_, *content, from_=None): | 
					
						
							|  |  |  |     ...     try: | 
					
						
							|  |  |  |     ...         raise type_(*content) from from_ | 
					
						
							|  |  |  |     ...     except Exception as out: | 
					
						
							|  |  |  |     ...         return out | 
					
						
							|  |  |  |     ... | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-08-28 20:31:03 +02:00
										 |  |  |     >>> def main(): | 
					
						
							|  |  |  |     ...     try: | 
					
						
							|  |  |  |     ...         raise ValueError('Context Not Shown') | 
					
						
							|  |  |  |     ...     except Exception as e1: | 
					
						
							| 
									
										
										
										
											2023-09-06 11:41:56 +02:00
										 |  |  |     ...         raise ValueError("With Cause") from make_exc_with_stack(TypeError,'The Cause') | 
					
						
							| 
									
										
										
										
											2023-08-28 20:31:03 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     >>> def test_function(): | 
					
						
							|  |  |  |     ...     import pdb; | 
					
						
							|  |  |  |     ...     instance = pdb.Pdb(nosigint=True, readrc=False) | 
					
						
							|  |  |  |     ...     try: | 
					
						
							|  |  |  |     ...         main() | 
					
						
							|  |  |  |     ...     except Exception as e: | 
					
						
							| 
									
										
										
										
											2023-09-06 11:41:56 +02:00
										 |  |  |     ...         pdb._post_mortem(e, instance) | 
					
						
							| 
									
										
										
										
											2023-08-28 20:31:03 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     >>> with PdbTestInput([  # doctest: +ELLIPSIS, +NORMALIZE_WHITESPACE | 
					
						
							|  |  |  |     ...     'exceptions', | 
					
						
							| 
									
										
										
										
											2023-09-06 11:41:56 +02:00
										 |  |  |     ...     'exceptions 0', | 
					
						
							| 
									
										
										
										
											2023-08-28 20:31:03 +02:00
										 |  |  |     ...     'exceptions 1', | 
					
						
							|  |  |  |     ...     'up', | 
					
						
							|  |  |  |     ...     'down', | 
					
						
							|  |  |  |     ...     'exit', | 
					
						
							|  |  |  |     ... ]): | 
					
						
							|  |  |  |     ...    try: | 
					
						
							|  |  |  |     ...        test_function() | 
					
						
							|  |  |  |     ...    except ValueError: | 
					
						
							|  |  |  |     ...        print('Ok.') | 
					
						
							| 
									
										
										
										
											2023-09-06 11:41:56 +02:00
										 |  |  |     > <doctest test.test_pdb.test_post_mortem_cause_no_context[1]>(5)main() | 
					
						
							|  |  |  |     -> raise ValueError("With Cause") from make_exc_with_stack(TypeError,'The Cause') | 
					
						
							| 
									
										
										
										
											2023-08-28 20:31:03 +02:00
										 |  |  |     (Pdb) exceptions | 
					
						
							| 
									
										
										
										
											2023-09-06 11:41:56 +02:00
										 |  |  |         0 TypeError('The Cause') | 
					
						
							|  |  |  |     >   1 ValueError('With Cause') | 
					
						
							|  |  |  |     (Pdb) exceptions 0 | 
					
						
							|  |  |  |     > <doctest test.test_pdb.test_post_mortem_cause_no_context[0]>(3)make_exc_with_stack() | 
					
						
							|  |  |  |     -> raise type_(*content) from from_ | 
					
						
							| 
									
										
										
										
											2023-08-28 20:31:03 +02:00
										 |  |  |     (Pdb) exceptions 1 | 
					
						
							| 
									
										
										
										
											2023-09-06 11:41:56 +02:00
										 |  |  |     > <doctest test.test_pdb.test_post_mortem_cause_no_context[1]>(5)main() | 
					
						
							|  |  |  |     -> raise ValueError("With Cause") from make_exc_with_stack(TypeError,'The Cause') | 
					
						
							| 
									
										
										
										
											2023-08-28 20:31:03 +02:00
										 |  |  |     (Pdb) up | 
					
						
							| 
									
										
										
										
											2023-09-06 11:41:56 +02:00
										 |  |  |     > <doctest test.test_pdb.test_post_mortem_cause_no_context[2]>(5)test_function() | 
					
						
							| 
									
										
										
										
											2023-08-28 20:31:03 +02:00
										 |  |  |     -> main() | 
					
						
							|  |  |  |     (Pdb) down | 
					
						
							| 
									
										
										
										
											2023-09-06 11:41:56 +02:00
										 |  |  |     > <doctest test.test_pdb.test_post_mortem_cause_no_context[1]>(5)main() | 
					
						
							|  |  |  |     -> raise ValueError("With Cause") from make_exc_with_stack(TypeError,'The Cause') | 
					
						
							| 
									
										
										
										
											2023-08-28 20:31:03 +02:00
										 |  |  |     (Pdb) exit"""
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def test_post_mortem_context_of_the_cause(): | 
					
						
							|  |  |  |     """Test post mortem traceback debugging of chained exception
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     >>> def main(): | 
					
						
							|  |  |  |     ...     try: | 
					
						
							|  |  |  |     ...         raise TypeError('Context of the cause') | 
					
						
							|  |  |  |     ...     except Exception as e1: | 
					
						
							|  |  |  |     ...         try: | 
					
						
							|  |  |  |     ...             raise ValueError('Root Cause') | 
					
						
							|  |  |  |     ...         except Exception as e2: | 
					
						
							|  |  |  |     ...             ex = e2 | 
					
						
							|  |  |  |     ...         raise ValueError("With Cause, and cause has context") from ex | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     >>> def test_function(): | 
					
						
							|  |  |  |     ...     import pdb; | 
					
						
							|  |  |  |     ...     instance = pdb.Pdb(nosigint=True, readrc=False) | 
					
						
							|  |  |  |     ...     try: | 
					
						
							|  |  |  |     ...         main() | 
					
						
							|  |  |  |     ...     except Exception as e: | 
					
						
							| 
									
										
										
										
											2023-09-06 11:41:56 +02:00
										 |  |  |     ...         pdb._post_mortem(e, instance) | 
					
						
							| 
									
										
										
										
											2023-08-28 20:31:03 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     >>> with PdbTestInput([  # doctest: +ELLIPSIS, +NORMALIZE_WHITESPACE | 
					
						
							|  |  |  |     ...     'exceptions', | 
					
						
							|  |  |  |     ...     'exceptions 2', | 
					
						
							|  |  |  |     ...     'up', | 
					
						
							|  |  |  |     ...     'down', | 
					
						
							|  |  |  |     ...     'exceptions 3', | 
					
						
							|  |  |  |     ...     'up', | 
					
						
							|  |  |  |     ...     'down', | 
					
						
							|  |  |  |     ...     'exceptions 4', | 
					
						
							|  |  |  |     ...     'up', | 
					
						
							|  |  |  |     ...     'down', | 
					
						
							|  |  |  |     ...     'exit', | 
					
						
							|  |  |  |     ... ]): | 
					
						
							|  |  |  |     ...    try: | 
					
						
							|  |  |  |     ...        test_function() | 
					
						
							|  |  |  |     ...    except ValueError: | 
					
						
							|  |  |  |     ...        print('Correctly reraised.') | 
					
						
							|  |  |  |     > <doctest test.test_pdb.test_post_mortem_context_of_the_cause[0]>(9)main() | 
					
						
							|  |  |  |     -> raise ValueError("With Cause, and cause has context") from ex | 
					
						
							|  |  |  |     (Pdb) exceptions | 
					
						
							|  |  |  |       0 TypeError('Context of the cause') | 
					
						
							|  |  |  |       1 ValueError('Root Cause') | 
					
						
							|  |  |  |     > 2 ValueError('With Cause, and cause has context') | 
					
						
							|  |  |  |     (Pdb) exceptions 2 | 
					
						
							|  |  |  |     > <doctest test.test_pdb.test_post_mortem_context_of_the_cause[0]>(9)main() | 
					
						
							|  |  |  |     -> raise ValueError("With Cause, and cause has context") from ex | 
					
						
							|  |  |  |     (Pdb) up | 
					
						
							|  |  |  |     > <doctest test.test_pdb.test_post_mortem_context_of_the_cause[1]>(5)test_function() | 
					
						
							|  |  |  |     -> main() | 
					
						
							|  |  |  |     (Pdb) down | 
					
						
							|  |  |  |     > <doctest test.test_pdb.test_post_mortem_context_of_the_cause[0]>(9)main() | 
					
						
							|  |  |  |     -> raise ValueError("With Cause, and cause has context") from ex | 
					
						
							|  |  |  |     (Pdb) exceptions 3 | 
					
						
							|  |  |  |     *** No exception with that number | 
					
						
							|  |  |  |     (Pdb) up | 
					
						
							|  |  |  |     > <doctest test.test_pdb.test_post_mortem_context_of_the_cause[1]>(5)test_function() | 
					
						
							|  |  |  |     -> main() | 
					
						
							|  |  |  |     (Pdb) down | 
					
						
							|  |  |  |     > <doctest test.test_pdb.test_post_mortem_context_of_the_cause[0]>(9)main() | 
					
						
							|  |  |  |     -> raise ValueError("With Cause, and cause has context") from ex | 
					
						
							|  |  |  |     (Pdb) exceptions 4 | 
					
						
							|  |  |  |     *** No exception with that number | 
					
						
							|  |  |  |     (Pdb) up | 
					
						
							|  |  |  |     > <doctest test.test_pdb.test_post_mortem_context_of_the_cause[1]>(5)test_function() | 
					
						
							|  |  |  |     -> main() | 
					
						
							|  |  |  |     (Pdb) down | 
					
						
							|  |  |  |     > <doctest test.test_pdb.test_post_mortem_context_of_the_cause[0]>(9)main() | 
					
						
							|  |  |  |     -> raise ValueError("With Cause, and cause has context") from ex | 
					
						
							|  |  |  |     (Pdb) exit | 
					
						
							|  |  |  |     """
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def test_post_mortem_from_none(): | 
					
						
							|  |  |  |     """Test post mortem traceback debugging of chained exception
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     In particular that cause from None (which sets __supress_context__ to True) | 
					
						
							|  |  |  |     does not show context. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     >>> def main(): | 
					
						
							|  |  |  |     ...     try: | 
					
						
							|  |  |  |     ...         raise TypeError('Context of the cause') | 
					
						
							|  |  |  |     ...     except Exception as e1: | 
					
						
							|  |  |  |     ...         raise ValueError("With Cause, and cause has context") from None | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     >>> def test_function(): | 
					
						
							|  |  |  |     ...     import pdb; | 
					
						
							|  |  |  |     ...     instance = pdb.Pdb(nosigint=True, readrc=False) | 
					
						
							|  |  |  |     ...     try: | 
					
						
							|  |  |  |     ...         main() | 
					
						
							|  |  |  |     ...     except Exception as e: | 
					
						
							| 
									
										
										
										
											2023-09-06 11:41:56 +02:00
										 |  |  |     ...         pdb._post_mortem(e, instance) | 
					
						
							| 
									
										
										
										
											2023-08-28 20:31:03 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     >>> with PdbTestInput([  # doctest: +ELLIPSIS, +NORMALIZE_WHITESPACE | 
					
						
							|  |  |  |     ...     'exceptions', | 
					
						
							|  |  |  |     ...     'exit', | 
					
						
							|  |  |  |     ... ]): | 
					
						
							|  |  |  |     ...    try: | 
					
						
							|  |  |  |     ...        test_function() | 
					
						
							|  |  |  |     ...    except ValueError: | 
					
						
							|  |  |  |     ...        print('Correctly reraised.') | 
					
						
							|  |  |  |     > <doctest test.test_pdb.test_post_mortem_from_none[0]>(5)main() | 
					
						
							|  |  |  |     -> raise ValueError("With Cause, and cause has context") from None | 
					
						
							|  |  |  |     (Pdb) exceptions | 
					
						
							|  |  |  |     > 0 ValueError('With Cause, and cause has context') | 
					
						
							|  |  |  |     (Pdb) exit | 
					
						
							|  |  |  |     """
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-09-06 11:41:56 +02:00
										 |  |  | def test_post_mortem_from_no_stack(): | 
					
						
							|  |  |  |     """Test post mortem traceback debugging of chained exception
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     especially when one exception has no stack. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     >>> def main(): | 
					
						
							|  |  |  |     ...     raise Exception() from Exception() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     >>> def test_function(): | 
					
						
							|  |  |  |     ...     import pdb; | 
					
						
							|  |  |  |     ...     instance = pdb.Pdb(nosigint=True, readrc=False) | 
					
						
							|  |  |  |     ...     try: | 
					
						
							|  |  |  |     ...         main() | 
					
						
							|  |  |  |     ...     except Exception as e: | 
					
						
							|  |  |  |     ...         pdb._post_mortem(e, instance) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     >>> with PdbTestInput(  # doctest: +ELLIPSIS, +NORMALIZE_WHITESPACE | 
					
						
							|  |  |  |     ...     ["exceptions", | 
					
						
							|  |  |  |     ...      "exceptions 0", | 
					
						
							|  |  |  |     ...     "exit"], | 
					
						
							|  |  |  |     ... ): | 
					
						
							|  |  |  |     ...    try: | 
					
						
							|  |  |  |     ...        test_function() | 
					
						
							|  |  |  |     ...    except ValueError: | 
					
						
							|  |  |  |     ...        print('Correctly reraised.') | 
					
						
							|  |  |  |     > <doctest test.test_pdb.test_post_mortem_from_no_stack[0]>(2)main() | 
					
						
							|  |  |  |     -> raise Exception() from Exception() | 
					
						
							|  |  |  |     (Pdb) exceptions | 
					
						
							|  |  |  |         - Exception() | 
					
						
							|  |  |  |     >   1 Exception() | 
					
						
							|  |  |  |     (Pdb) exceptions 0 | 
					
						
							|  |  |  |     *** This exception does not have a traceback, cannot jump to it | 
					
						
							|  |  |  |     (Pdb) exit | 
					
						
							|  |  |  |     """
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def test_post_mortem_single_no_stack(): | 
					
						
							|  |  |  |     """Test post mortem called when origin exception has no stack
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     >>> def test_function(): | 
					
						
							|  |  |  |     ...     import pdb; | 
					
						
							|  |  |  |     ...     instance = pdb.Pdb(nosigint=True, readrc=False) | 
					
						
							|  |  |  |     ...     import sys | 
					
						
							|  |  |  |     ...     sys.last_exc = Exception() | 
					
						
							|  |  |  |     ...     pdb._post_mortem(sys.last_exc, instance) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     >>> with PdbTestInput(  # doctest: +ELLIPSIS, +NORMALIZE_WHITESPACE | 
					
						
							|  |  |  |     ...     [] | 
					
						
							|  |  |  |     ... ): | 
					
						
							|  |  |  |     ...    try: | 
					
						
							|  |  |  |     ...        test_function() | 
					
						
							|  |  |  |     ...    except ValueError as e: | 
					
						
							|  |  |  |     ...        print(e) | 
					
						
							|  |  |  |     A valid traceback must be passed if no exception is being handled | 
					
						
							|  |  |  |     """
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-08-28 20:31:03 +02:00
										 |  |  | def test_post_mortem_complex(): | 
					
						
							|  |  |  |     """Test post mortem traceback debugging of chained exception
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     Test with simple and complex cycles, exception groups,... | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     >>> def make_ex_with_stack(type_, *content, from_=None): | 
					
						
							|  |  |  |     ...     try: | 
					
						
							|  |  |  |     ...         raise type_(*content) from from_ | 
					
						
							|  |  |  |     ...     except Exception as out: | 
					
						
							|  |  |  |     ...         return out | 
					
						
							|  |  |  |     ... | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     >>> def cycle(): | 
					
						
							|  |  |  |     ...     try: | 
					
						
							|  |  |  |     ...         raise ValueError("Cycle Leaf") | 
					
						
							|  |  |  |     ...     except Exception as e: | 
					
						
							|  |  |  |     ...         raise e from e | 
					
						
							|  |  |  |     ... | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     >>> def tri_cycle(): | 
					
						
							|  |  |  |     ...     a = make_ex_with_stack(ValueError, "Cycle1") | 
					
						
							|  |  |  |     ...     b = make_ex_with_stack(ValueError, "Cycle2") | 
					
						
							|  |  |  |     ...     c = make_ex_with_stack(ValueError, "Cycle3") | 
					
						
							|  |  |  |     ... | 
					
						
							|  |  |  |     ...     a.__cause__ = b | 
					
						
							|  |  |  |     ...     b.__cause__ = c | 
					
						
							|  |  |  |     ... | 
					
						
							|  |  |  |     ...     raise c from a | 
					
						
							|  |  |  |     ... | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     >>> def cause(): | 
					
						
							|  |  |  |     ...     try: | 
					
						
							|  |  |  |     ...         raise ValueError("Cause Leaf") | 
					
						
							|  |  |  |     ...     except Exception as e: | 
					
						
							|  |  |  |     ...         raise e | 
					
						
							|  |  |  |     ... | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     >>> def context(n=10): | 
					
						
							|  |  |  |     ...     try: | 
					
						
							|  |  |  |     ...         raise ValueError(f"Context Leaf {n}") | 
					
						
							|  |  |  |     ...     except Exception as e: | 
					
						
							|  |  |  |     ...         if n == 0: | 
					
						
							|  |  |  |     ...             raise ValueError(f"With Context {n}") from e | 
					
						
							|  |  |  |     ...         else: | 
					
						
							|  |  |  |     ...             context(n - 1) | 
					
						
							|  |  |  |     ... | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     >>> def main(): | 
					
						
							|  |  |  |     ...     try: | 
					
						
							|  |  |  |     ...         cycle() | 
					
						
							|  |  |  |     ...     except Exception as e1: | 
					
						
							|  |  |  |     ...         try: | 
					
						
							|  |  |  |     ...             tri_cycle() | 
					
						
							|  |  |  |     ...         except Exception as e2: | 
					
						
							|  |  |  |     ...             ex = e2 | 
					
						
							|  |  |  |     ...         raise ValueError("With Context and With Cause") from ex | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     >>> def test_function(): | 
					
						
							|  |  |  |     ...     import pdb; | 
					
						
							|  |  |  |     ...     instance = pdb.Pdb(nosigint=True, readrc=False) | 
					
						
							|  |  |  |     ...     try: | 
					
						
							|  |  |  |     ...         main() | 
					
						
							|  |  |  |     ...     except Exception as e: | 
					
						
							| 
									
										
										
										
											2023-09-06 11:41:56 +02:00
										 |  |  |     ...         pdb._post_mortem(e, instance) | 
					
						
							| 
									
										
										
										
											2023-08-28 20:31:03 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     >>> with PdbTestInput(  # doctest: +ELLIPSIS, +NORMALIZE_WHITESPACE | 
					
						
							|  |  |  |     ...     ["exceptions", | 
					
						
							|  |  |  |     ...     "exceptions 0", | 
					
						
							|  |  |  |     ...     "exceptions 1", | 
					
						
							|  |  |  |     ...     "exceptions 2", | 
					
						
							|  |  |  |     ...     "exceptions 3", | 
					
						
							|  |  |  |     ...     "exit"], | 
					
						
							|  |  |  |     ... ): | 
					
						
							|  |  |  |     ...    try: | 
					
						
							|  |  |  |     ...        test_function() | 
					
						
							|  |  |  |     ...    except ValueError: | 
					
						
							|  |  |  |     ...        print('Correctly reraised.') | 
					
						
							|  |  |  |         > <doctest test.test_pdb.test_post_mortem_complex[5]>(9)main() | 
					
						
							|  |  |  |     -> raise ValueError("With Context and With Cause") from ex | 
					
						
							|  |  |  |     (Pdb) exceptions | 
					
						
							|  |  |  |         0 ValueError('Cycle2') | 
					
						
							|  |  |  |         1 ValueError('Cycle1') | 
					
						
							|  |  |  |         2 ValueError('Cycle3') | 
					
						
							|  |  |  |     >   3 ValueError('With Context and With Cause') | 
					
						
							|  |  |  |     (Pdb) exceptions 0 | 
					
						
							|  |  |  |     > <doctest test.test_pdb.test_post_mortem_complex[0]>(3)make_ex_with_stack() | 
					
						
							|  |  |  |     -> raise type_(*content) from from_ | 
					
						
							|  |  |  |     (Pdb) exceptions 1 | 
					
						
							|  |  |  |     > <doctest test.test_pdb.test_post_mortem_complex[0]>(3)make_ex_with_stack() | 
					
						
							|  |  |  |     -> raise type_(*content) from from_ | 
					
						
							|  |  |  |     (Pdb) exceptions 2 | 
					
						
							|  |  |  |     > <doctest test.test_pdb.test_post_mortem_complex[0]>(3)make_ex_with_stack() | 
					
						
							|  |  |  |     -> raise type_(*content) from from_ | 
					
						
							|  |  |  |     (Pdb) exceptions 3 | 
					
						
							|  |  |  |     > <doctest test.test_pdb.test_post_mortem_complex[5]>(9)main() | 
					
						
							|  |  |  |     -> raise ValueError("With Context and With Cause") from ex | 
					
						
							|  |  |  |     (Pdb) exit | 
					
						
							|  |  |  |     """
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-07-30 18:46:38 +00:00
										 |  |  | def test_post_mortem(): | 
					
						
							|  |  |  |     """Test post mortem traceback debugging.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     >>> def test_function_2(): | 
					
						
							|  |  |  |     ...     try: | 
					
						
							|  |  |  |     ...         1/0 | 
					
						
							|  |  |  |     ...     finally: | 
					
						
							|  |  |  |     ...         print('Exception!') | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     >>> def test_function(): | 
					
						
							| 
									
										
										
										
											2016-09-09 22:21:17 -07:00
										 |  |  |     ...     import pdb; pdb.Pdb(nosigint=True, readrc=False).set_trace() | 
					
						
							| 
									
										
										
										
											2010-07-30 18:46:38 +00:00
										 |  |  |     ...     test_function_2() | 
					
						
							|  |  |  |     ...     print('Not reached.') | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     >>> with PdbTestInput([  # doctest: +ELLIPSIS, +NORMALIZE_WHITESPACE | 
					
						
							| 
									
										
										
										
											2024-05-05 07:05:01 -07:00
										 |  |  |     ...     'step',      # step to test_function_2() line | 
					
						
							| 
									
										
										
										
											2010-07-30 18:46:38 +00:00
										 |  |  |     ...     'next',      # step over exception-raising call | 
					
						
							|  |  |  |     ...     'bt',        # get a backtrace | 
					
						
							|  |  |  |     ...     'list',      # list code of test_function() | 
					
						
							|  |  |  |     ...     'down',      # step into test_function_2() | 
					
						
							|  |  |  |     ...     'list',      # list code of test_function_2() | 
					
						
							|  |  |  |     ...     'continue', | 
					
						
							|  |  |  |     ... ]): | 
					
						
							|  |  |  |     ...    try: | 
					
						
							|  |  |  |     ...        test_function() | 
					
						
							|  |  |  |     ...    except ZeroDivisionError: | 
					
						
							|  |  |  |     ...        print('Correctly reraised.') | 
					
						
							| 
									
										
										
										
											2024-05-05 07:05:01 -07:00
										 |  |  |     > <doctest test.test_pdb.test_post_mortem[1]>(2)test_function() | 
					
						
							|  |  |  |     -> import pdb; pdb.Pdb(nosigint=True, readrc=False).set_trace() | 
					
						
							|  |  |  |     (Pdb) step | 
					
						
							| 
									
										
										
										
											2010-07-30 18:46:38 +00:00
										 |  |  |     > <doctest test.test_pdb.test_post_mortem[1]>(3)test_function() | 
					
						
							|  |  |  |     -> test_function_2() | 
					
						
							|  |  |  |     (Pdb) next | 
					
						
							|  |  |  |     Exception! | 
					
						
							|  |  |  |     ZeroDivisionError: division by zero | 
					
						
							|  |  |  |     > <doctest test.test_pdb.test_post_mortem[1]>(3)test_function() | 
					
						
							|  |  |  |     -> test_function_2() | 
					
						
							|  |  |  |     (Pdb) bt | 
					
						
							|  |  |  |     ... | 
					
						
							| 
									
										
										
										
											2024-05-05 07:05:01 -07:00
										 |  |  |       <doctest test.test_pdb.test_post_mortem[2]>(11)<module>() | 
					
						
							| 
									
										
										
										
											2010-07-30 18:46:38 +00:00
										 |  |  |     -> test_function() | 
					
						
							|  |  |  |     > <doctest test.test_pdb.test_post_mortem[1]>(3)test_function() | 
					
						
							|  |  |  |     -> test_function_2() | 
					
						
							|  |  |  |       <doctest test.test_pdb.test_post_mortem[0]>(3)test_function_2() | 
					
						
							|  |  |  |     -> 1/0 | 
					
						
							|  |  |  |     (Pdb) list | 
					
						
							|  |  |  |       1         def test_function(): | 
					
						
							| 
									
										
										
										
											2016-09-09 22:21:17 -07:00
										 |  |  |       2             import pdb; pdb.Pdb(nosigint=True, readrc=False).set_trace() | 
					
						
							| 
									
										
										
										
											2010-07-30 18:46:38 +00:00
										 |  |  |       3  ->         test_function_2() | 
					
						
							|  |  |  |       4             print('Not reached.') | 
					
						
							|  |  |  |     [EOF] | 
					
						
							|  |  |  |     (Pdb) down | 
					
						
							|  |  |  |     > <doctest test.test_pdb.test_post_mortem[0]>(3)test_function_2() | 
					
						
							|  |  |  |     -> 1/0 | 
					
						
							|  |  |  |     (Pdb) list | 
					
						
							|  |  |  |       1         def test_function_2(): | 
					
						
							|  |  |  |       2             try: | 
					
						
							|  |  |  |       3  >>             1/0 | 
					
						
							|  |  |  |       4             finally: | 
					
						
							|  |  |  |       5  ->             print('Exception!') | 
					
						
							|  |  |  |     [EOF] | 
					
						
							|  |  |  |     (Pdb) continue | 
					
						
							|  |  |  |     Correctly reraised. | 
					
						
							|  |  |  |     """
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-05-13 05:38:21 -07:00
										 |  |  | def test_pdb_return_to_different_file(): | 
					
						
							|  |  |  |     """When pdb returns to a different file, it should not skip if f_trace is
 | 
					
						
							|  |  |  |        not already set | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     >>> import pprint | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     >>> class A: | 
					
						
							|  |  |  |     ...    def __repr__(self): | 
					
						
							|  |  |  |     ...        return 'A' | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     >>> def test_function(): | 
					
						
							|  |  |  |     ...     import pdb; pdb.Pdb(nosigint=True, readrc=False).set_trace() | 
					
						
							|  |  |  |     ...     pprint.pprint(A()) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     >>> reset_Breakpoint() | 
					
						
							|  |  |  |     >>> with PdbTestInput([  # doctest: +ELLIPSIS, +NORMALIZE_WHITESPACE | 
					
						
							|  |  |  |     ...     'b A.__repr__', | 
					
						
							|  |  |  |     ...     'continue', | 
					
						
							|  |  |  |     ...     'return', | 
					
						
							|  |  |  |     ...     'next', | 
					
						
							|  |  |  |     ...     'return', | 
					
						
							|  |  |  |     ...     'return', | 
					
						
							|  |  |  |     ...     'continue', | 
					
						
							|  |  |  |     ... ]): | 
					
						
							|  |  |  |     ...    test_function() | 
					
						
							|  |  |  |     > <doctest test.test_pdb.test_pdb_return_to_different_file[2]>(2)test_function() | 
					
						
							|  |  |  |     -> import pdb; pdb.Pdb(nosigint=True, readrc=False).set_trace() | 
					
						
							|  |  |  |     (Pdb) b A.__repr__ | 
					
						
							|  |  |  |     Breakpoint 1 at <doctest test.test_pdb.test_pdb_return_to_different_file[1]>:3 | 
					
						
							|  |  |  |     (Pdb) continue | 
					
						
							|  |  |  |     > <doctest test.test_pdb.test_pdb_return_to_different_file[1]>(3)__repr__() | 
					
						
							|  |  |  |     -> return 'A' | 
					
						
							|  |  |  |     (Pdb) return | 
					
						
							|  |  |  |     --Return-- | 
					
						
							|  |  |  |     > <doctest test.test_pdb.test_pdb_return_to_different_file[1]>(3)__repr__()->'A' | 
					
						
							|  |  |  |     -> return 'A' | 
					
						
							|  |  |  |     (Pdb) next | 
					
						
							|  |  |  |     > ...pprint.py..._safe_repr() | 
					
						
							|  |  |  |     -> return rep,... | 
					
						
							|  |  |  |     (Pdb) return | 
					
						
							|  |  |  |     --Return-- | 
					
						
							|  |  |  |     > ...pprint.py..._safe_repr()->('A'...) | 
					
						
							|  |  |  |     -> return rep,... | 
					
						
							|  |  |  |     (Pdb) return | 
					
						
							|  |  |  |     --Return-- | 
					
						
							|  |  |  |     > ...pprint.py...format()->('A'...) | 
					
						
							|  |  |  |     -> return... | 
					
						
							|  |  |  |     (Pdb) continue | 
					
						
							|  |  |  |     A | 
					
						
							|  |  |  |     """
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-05-05 09:00:19 +00:00
										 |  |  | def test_pdb_skip_modules(): | 
					
						
							|  |  |  |     """This illustrates the simple case of module skipping.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     >>> def skip_module(): | 
					
						
							|  |  |  |     ...     import string | 
					
						
							| 
									
										
										
										
											2016-09-09 22:21:17 -07:00
										 |  |  |     ...     import pdb; pdb.Pdb(skip=['stri*'], nosigint=True, readrc=False).set_trace() | 
					
						
							| 
									
										
										
										
											2009-05-05 09:00:19 +00:00
										 |  |  |     ...     string.capwords('FOO') | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-09-16 16:40:45 +00:00
										 |  |  |     >>> with PdbTestInput([ | 
					
						
							|  |  |  |     ...     'step', | 
					
						
							| 
									
										
										
										
											2024-05-05 07:05:01 -07:00
										 |  |  |     ...     'step', | 
					
						
							| 
									
										
										
										
											2009-09-16 16:40:45 +00:00
										 |  |  |     ...     'continue', | 
					
						
							|  |  |  |     ... ]): | 
					
						
							| 
									
										
										
										
											2009-05-05 09:00:19 +00:00
										 |  |  |     ...     skip_module() | 
					
						
							| 
									
										
										
										
											2024-05-05 07:05:01 -07:00
										 |  |  |     > <doctest test.test_pdb.test_pdb_skip_modules[0]>(3)skip_module() | 
					
						
							|  |  |  |     -> import pdb; pdb.Pdb(skip=['stri*'], nosigint=True, readrc=False).set_trace() | 
					
						
							|  |  |  |     (Pdb) step | 
					
						
							| 
									
										
										
										
											2009-05-05 09:00:19 +00:00
										 |  |  |     > <doctest test.test_pdb.test_pdb_skip_modules[0]>(4)skip_module() | 
					
						
							|  |  |  |     -> string.capwords('FOO') | 
					
						
							|  |  |  |     (Pdb) step | 
					
						
							|  |  |  |     --Return-- | 
					
						
							|  |  |  |     > <doctest test.test_pdb.test_pdb_skip_modules[0]>(4)skip_module()->None | 
					
						
							|  |  |  |     -> string.capwords('FOO') | 
					
						
							|  |  |  |     (Pdb) continue | 
					
						
							| 
									
										
										
										
											2009-09-16 16:40:45 +00:00
										 |  |  |     """
 | 
					
						
							| 
									
										
										
										
											2009-05-05 09:00:19 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-06-01 04:51:46 +08:00
										 |  |  | def test_pdb_invalid_arg(): | 
					
						
							|  |  |  |     """This tests pdb commands that have invalid arguments
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     >>> def test_function(): | 
					
						
							|  |  |  |     ...     import pdb; pdb.Pdb(nosigint=True, readrc=False).set_trace() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     >>> with PdbTestInput([ | 
					
						
							|  |  |  |     ...     'a = 3', | 
					
						
							|  |  |  |     ...     'll 4', | 
					
						
							|  |  |  |     ...     'step 1', | 
					
						
							|  |  |  |     ...     'continue' | 
					
						
							|  |  |  |     ... ]): | 
					
						
							|  |  |  |     ...     test_function() | 
					
						
							| 
									
										
										
										
											2024-05-05 07:05:01 -07:00
										 |  |  |     > <doctest test.test_pdb.test_pdb_invalid_arg[0]>(2)test_function() | 
					
						
							|  |  |  |     -> import pdb; pdb.Pdb(nosigint=True, readrc=False).set_trace() | 
					
						
							| 
									
										
										
										
											2023-06-01 04:51:46 +08:00
										 |  |  |     (Pdb) a = 3 | 
					
						
							|  |  |  |     *** Invalid argument: = 3 | 
					
						
							|  |  |  |           Usage: a(rgs) | 
					
						
							|  |  |  |     (Pdb) ll 4 | 
					
						
							|  |  |  |     *** Invalid argument: 4 | 
					
						
							|  |  |  |           Usage: ll | longlist | 
					
						
							|  |  |  |     (Pdb) step 1 | 
					
						
							|  |  |  |     *** Invalid argument: 1 | 
					
						
							|  |  |  |           Usage: s(tep) | 
					
						
							|  |  |  |     (Pdb) continue | 
					
						
							|  |  |  |     """
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-05-05 09:00:19 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | # Module for testing skipping of module that makes a callback | 
					
						
							| 
									
										
										
										
											2013-06-15 17:11:25 -04:00
										 |  |  | mod = types.ModuleType('module_to_skip') | 
					
						
							| 
									
										
										
										
											2009-05-05 09:00:19 +00:00
										 |  |  | exec('def foo_pony(callback): x = 1; callback(); return None', mod.__dict__) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def test_pdb_skip_modules_with_callback(): | 
					
						
							|  |  |  |     """This illustrates skipping of modules that call into other code.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     >>> def skip_module(): | 
					
						
							|  |  |  |     ...     def callback(): | 
					
						
							|  |  |  |     ...         return None | 
					
						
							| 
									
										
										
										
											2016-09-09 22:21:17 -07:00
										 |  |  |     ...     import pdb; pdb.Pdb(skip=['module_to_skip*'], nosigint=True, readrc=False).set_trace() | 
					
						
							| 
									
										
										
										
											2009-05-05 09:00:19 +00:00
										 |  |  |     ...     mod.foo_pony(callback) | 
					
						
							| 
									
										
										
										
											2009-09-16 16:40:45 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     >>> with PdbTestInput([ | 
					
						
							|  |  |  |     ...     'step', | 
					
						
							|  |  |  |     ...     'step', | 
					
						
							|  |  |  |     ...     'step', | 
					
						
							|  |  |  |     ...     'step', | 
					
						
							|  |  |  |     ...     'step', | 
					
						
							| 
									
										
										
										
											2024-05-05 07:05:01 -07:00
										 |  |  |     ...     'step', | 
					
						
							| 
									
										
										
										
											2009-09-16 16:40:45 +00:00
										 |  |  |     ...     'continue', | 
					
						
							|  |  |  |     ... ]): | 
					
						
							| 
									
										
										
										
											2009-05-05 09:00:19 +00:00
										 |  |  |     ...     skip_module() | 
					
						
							| 
									
										
										
										
											2009-09-16 16:40:45 +00:00
										 |  |  |     ...     pass  # provides something to "step" to | 
					
						
							| 
									
										
										
										
											2024-05-05 07:05:01 -07:00
										 |  |  |     > <doctest test.test_pdb.test_pdb_skip_modules_with_callback[0]>(4)skip_module() | 
					
						
							|  |  |  |     -> import pdb; pdb.Pdb(skip=['module_to_skip*'], nosigint=True, readrc=False).set_trace() | 
					
						
							|  |  |  |     (Pdb) step | 
					
						
							| 
									
										
										
										
											2009-05-05 09:00:19 +00:00
										 |  |  |     > <doctest test.test_pdb.test_pdb_skip_modules_with_callback[0]>(5)skip_module() | 
					
						
							|  |  |  |     -> mod.foo_pony(callback) | 
					
						
							|  |  |  |     (Pdb) step | 
					
						
							|  |  |  |     --Call-- | 
					
						
							|  |  |  |     > <doctest test.test_pdb.test_pdb_skip_modules_with_callback[0]>(2)callback() | 
					
						
							|  |  |  |     -> def callback(): | 
					
						
							|  |  |  |     (Pdb) step | 
					
						
							|  |  |  |     > <doctest test.test_pdb.test_pdb_skip_modules_with_callback[0]>(3)callback() | 
					
						
							|  |  |  |     -> return None | 
					
						
							|  |  |  |     (Pdb) step | 
					
						
							|  |  |  |     --Return-- | 
					
						
							|  |  |  |     > <doctest test.test_pdb.test_pdb_skip_modules_with_callback[0]>(3)callback()->None | 
					
						
							|  |  |  |     -> return None | 
					
						
							|  |  |  |     (Pdb) step | 
					
						
							|  |  |  |     --Return-- | 
					
						
							|  |  |  |     > <doctest test.test_pdb.test_pdb_skip_modules_with_callback[0]>(5)skip_module()->None | 
					
						
							|  |  |  |     -> mod.foo_pony(callback) | 
					
						
							|  |  |  |     (Pdb) step | 
					
						
							| 
									
										
										
										
											2024-05-05 07:05:01 -07:00
										 |  |  |     > <doctest test.test_pdb.test_pdb_skip_modules_with_callback[1]>(11)<module>() | 
					
						
							| 
									
										
										
										
											2009-09-16 16:40:45 +00:00
										 |  |  |     -> pass  # provides something to "step" to | 
					
						
							| 
									
										
										
										
											2009-05-05 09:00:19 +00:00
										 |  |  |     (Pdb) continue | 
					
						
							| 
									
										
										
										
											2009-09-16 16:40:45 +00:00
										 |  |  |     """
 | 
					
						
							| 
									
										
										
										
											2009-05-05 09:00:19 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-07-30 10:29:19 +00:00
										 |  |  | def test_pdb_continue_in_bottomframe(): | 
					
						
							|  |  |  |     """Test that "continue" and "next" work properly in bottom frame (issue #5294).
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     >>> def test_function(): | 
					
						
							| 
									
										
										
										
											2016-09-09 22:21:17 -07:00
										 |  |  |     ...     import pdb, sys; inst = pdb.Pdb(nosigint=True, readrc=False) | 
					
						
							| 
									
										
										
										
											2010-07-30 10:29:19 +00:00
										 |  |  |     ...     inst.set_trace() | 
					
						
							|  |  |  |     ...     inst.botframe = sys._getframe()  # hackery to get the right botframe | 
					
						
							|  |  |  |     ...     print(1) | 
					
						
							|  |  |  |     ...     print(2) | 
					
						
							|  |  |  |     ...     print(3) | 
					
						
							|  |  |  |     ...     print(4) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-07-30 12:01:20 +00:00
										 |  |  |     >>> with PdbTestInput([  # doctest: +ELLIPSIS | 
					
						
							| 
									
										
										
										
											2024-05-05 07:05:01 -07:00
										 |  |  |     ...     'step', | 
					
						
							| 
									
										
										
										
											2010-07-30 10:29:19 +00:00
										 |  |  |     ...     'next', | 
					
						
							|  |  |  |     ...     'break 7', | 
					
						
							|  |  |  |     ...     'continue', | 
					
						
							|  |  |  |     ...     'next', | 
					
						
							|  |  |  |     ...     'continue', | 
					
						
							|  |  |  |     ...     'continue', | 
					
						
							|  |  |  |     ... ]): | 
					
						
							|  |  |  |     ...    test_function() | 
					
						
							| 
									
										
										
										
											2024-05-05 07:05:01 -07:00
										 |  |  |     > <doctest test.test_pdb.test_pdb_continue_in_bottomframe[0]>(3)test_function() | 
					
						
							|  |  |  |     -> inst.set_trace() | 
					
						
							|  |  |  |     (Pdb) step | 
					
						
							| 
									
										
										
										
											2010-07-30 10:29:19 +00:00
										 |  |  |     > <doctest test.test_pdb.test_pdb_continue_in_bottomframe[0]>(4)test_function() | 
					
						
							|  |  |  |     -> inst.botframe = sys._getframe()  # hackery to get the right botframe | 
					
						
							|  |  |  |     (Pdb) next | 
					
						
							|  |  |  |     > <doctest test.test_pdb.test_pdb_continue_in_bottomframe[0]>(5)test_function() | 
					
						
							|  |  |  |     -> print(1) | 
					
						
							|  |  |  |     (Pdb) break 7 | 
					
						
							| 
									
										
										
										
											2010-07-30 12:01:20 +00:00
										 |  |  |     Breakpoint ... at <doctest test.test_pdb.test_pdb_continue_in_bottomframe[0]>:7 | 
					
						
							| 
									
										
										
										
											2010-07-30 10:29:19 +00:00
										 |  |  |     (Pdb) continue | 
					
						
							|  |  |  |     1 | 
					
						
							|  |  |  |     2 | 
					
						
							|  |  |  |     > <doctest test.test_pdb.test_pdb_continue_in_bottomframe[0]>(7)test_function() | 
					
						
							|  |  |  |     -> print(3) | 
					
						
							|  |  |  |     (Pdb) next | 
					
						
							|  |  |  |     3 | 
					
						
							|  |  |  |     > <doctest test.test_pdb.test_pdb_continue_in_bottomframe[0]>(8)test_function() | 
					
						
							|  |  |  |     -> print(4) | 
					
						
							|  |  |  |     (Pdb) continue | 
					
						
							|  |  |  |     4 | 
					
						
							|  |  |  |     """
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-07-30 12:01:20 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-07-30 09:14:20 +00:00
										 |  |  | def pdb_invoke(method, arg): | 
					
						
							|  |  |  |     """Run pdb.method(arg).""" | 
					
						
							| 
									
										
										
										
											2016-09-09 22:21:17 -07:00
										 |  |  |     getattr(pdb.Pdb(nosigint=True, readrc=False), method)(arg) | 
					
						
							| 
									
										
										
										
											2010-07-30 09:14:20 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def test_pdb_run_with_incorrect_argument(): | 
					
						
							|  |  |  |     """Testing run and runeval with incorrect first argument.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     >>> pti = PdbTestInput(['continue',]) | 
					
						
							|  |  |  |     >>> with pti: | 
					
						
							|  |  |  |     ...     pdb_invoke('run', lambda x: x) | 
					
						
							|  |  |  |     Traceback (most recent call last): | 
					
						
							|  |  |  |     TypeError: exec() arg 1 must be a string, bytes or code object | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     >>> with pti: | 
					
						
							|  |  |  |     ...     pdb_invoke('runeval', lambda x: x) | 
					
						
							|  |  |  |     Traceback (most recent call last): | 
					
						
							|  |  |  |     TypeError: eval() arg 1 must be a string, bytes or code object | 
					
						
							|  |  |  |     """
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def test_pdb_run_with_code_object(): | 
					
						
							|  |  |  |     """Testing run and runeval with code object as a first argument.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-07-31 08:14:16 +00:00
										 |  |  |     >>> with PdbTestInput(['step','x', 'continue']):  # doctest: +ELLIPSIS | 
					
						
							| 
									
										
										
										
											2010-07-30 09:14:20 +00:00
										 |  |  |     ...     pdb_invoke('run', compile('x=1', '<string>', 'exec')) | 
					
						
							| 
									
										
										
										
											2010-07-31 08:14:16 +00:00
										 |  |  |     > <string>(1)<module>()... | 
					
						
							| 
									
										
										
										
											2010-07-30 09:14:20 +00:00
										 |  |  |     (Pdb) step | 
					
						
							|  |  |  |     --Return-- | 
					
						
							|  |  |  |     > <string>(1)<module>()->None | 
					
						
							|  |  |  |     (Pdb) x | 
					
						
							|  |  |  |     1 | 
					
						
							|  |  |  |     (Pdb) continue | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     >>> with PdbTestInput(['x', 'continue']): | 
					
						
							|  |  |  |     ...     x=0 | 
					
						
							|  |  |  |     ...     pdb_invoke('runeval', compile('x+1', '<string>', 'eval')) | 
					
						
							|  |  |  |     > <string>(1)<module>()->None | 
					
						
							|  |  |  |     (Pdb) x | 
					
						
							|  |  |  |     1 | 
					
						
							|  |  |  |     (Pdb) continue | 
					
						
							|  |  |  |     """
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-11-21 11:30:06 -08:00
										 |  |  | def test_next_until_return_at_return_event(): | 
					
						
							|  |  |  |     """Test that pdb stops after a next/until/return issued at a return debug event.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     >>> def test_function_2(): | 
					
						
							|  |  |  |     ...     x = 1 | 
					
						
							|  |  |  |     ...     x = 2 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     >>> def test_function(): | 
					
						
							| 
									
										
										
										
											2016-09-09 22:21:17 -07:00
										 |  |  |     ...     import pdb; pdb.Pdb(nosigint=True, readrc=False).set_trace() | 
					
						
							| 
									
										
										
										
											2013-11-21 11:30:06 -08:00
										 |  |  |     ...     test_function_2() | 
					
						
							|  |  |  |     ...     test_function_2() | 
					
						
							|  |  |  |     ...     test_function_2() | 
					
						
							|  |  |  |     ...     end = 1 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-04-02 17:15:21 +01:00
										 |  |  |     >>> reset_Breakpoint() | 
					
						
							| 
									
										
										
										
											2013-11-21 11:30:06 -08:00
										 |  |  |     >>> with PdbTestInput(['break test_function_2', | 
					
						
							|  |  |  |     ...                    'continue', | 
					
						
							|  |  |  |     ...                    'return', | 
					
						
							|  |  |  |     ...                    'next', | 
					
						
							|  |  |  |     ...                    'continue', | 
					
						
							|  |  |  |     ...                    'return', | 
					
						
							|  |  |  |     ...                    'until', | 
					
						
							|  |  |  |     ...                    'continue', | 
					
						
							|  |  |  |     ...                    'return', | 
					
						
							|  |  |  |     ...                    'return', | 
					
						
							|  |  |  |     ...                    'continue']): | 
					
						
							|  |  |  |     ...     test_function() | 
					
						
							| 
									
										
										
										
											2024-05-05 07:05:01 -07:00
										 |  |  |     > <doctest test.test_pdb.test_next_until_return_at_return_event[1]>(2)test_function() | 
					
						
							|  |  |  |     -> import pdb; pdb.Pdb(nosigint=True, readrc=False).set_trace() | 
					
						
							| 
									
										
										
										
											2013-11-21 11:30:06 -08:00
										 |  |  |     (Pdb) break test_function_2 | 
					
						
							| 
									
										
										
										
											2023-10-27 14:01:31 -07:00
										 |  |  |     Breakpoint 1 at <doctest test.test_pdb.test_next_until_return_at_return_event[0]>:2 | 
					
						
							| 
									
										
										
										
											2013-11-21 11:30:06 -08:00
										 |  |  |     (Pdb) continue | 
					
						
							|  |  |  |     > <doctest test.test_pdb.test_next_until_return_at_return_event[0]>(2)test_function_2() | 
					
						
							|  |  |  |     -> x = 1 | 
					
						
							|  |  |  |     (Pdb) return | 
					
						
							|  |  |  |     --Return-- | 
					
						
							|  |  |  |     > <doctest test.test_pdb.test_next_until_return_at_return_event[0]>(3)test_function_2()->None | 
					
						
							|  |  |  |     -> x = 2 | 
					
						
							|  |  |  |     (Pdb) next | 
					
						
							|  |  |  |     > <doctest test.test_pdb.test_next_until_return_at_return_event[1]>(4)test_function() | 
					
						
							|  |  |  |     -> test_function_2() | 
					
						
							|  |  |  |     (Pdb) continue | 
					
						
							|  |  |  |     > <doctest test.test_pdb.test_next_until_return_at_return_event[0]>(2)test_function_2() | 
					
						
							|  |  |  |     -> x = 1 | 
					
						
							|  |  |  |     (Pdb) return | 
					
						
							|  |  |  |     --Return-- | 
					
						
							|  |  |  |     > <doctest test.test_pdb.test_next_until_return_at_return_event[0]>(3)test_function_2()->None | 
					
						
							|  |  |  |     -> x = 2 | 
					
						
							|  |  |  |     (Pdb) until | 
					
						
							|  |  |  |     > <doctest test.test_pdb.test_next_until_return_at_return_event[1]>(5)test_function() | 
					
						
							|  |  |  |     -> test_function_2() | 
					
						
							|  |  |  |     (Pdb) continue | 
					
						
							|  |  |  |     > <doctest test.test_pdb.test_next_until_return_at_return_event[0]>(2)test_function_2() | 
					
						
							|  |  |  |     -> x = 1 | 
					
						
							|  |  |  |     (Pdb) return | 
					
						
							|  |  |  |     --Return-- | 
					
						
							|  |  |  |     > <doctest test.test_pdb.test_next_until_return_at_return_event[0]>(3)test_function_2()->None | 
					
						
							|  |  |  |     -> x = 2 | 
					
						
							|  |  |  |     (Pdb) return | 
					
						
							|  |  |  |     > <doctest test.test_pdb.test_next_until_return_at_return_event[1]>(6)test_function() | 
					
						
							|  |  |  |     -> end = 1 | 
					
						
							|  |  |  |     (Pdb) continue | 
					
						
							|  |  |  |     """
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def test_pdb_next_command_for_generator(): | 
					
						
							|  |  |  |     """Testing skip unwindng stack on yield for generators for "next" command
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     >>> def test_gen(): | 
					
						
							|  |  |  |     ...     yield 0 | 
					
						
							|  |  |  |     ...     return 1 | 
					
						
							|  |  |  |     ...     yield 2 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     >>> def test_function(): | 
					
						
							| 
									
										
										
										
											2016-09-09 22:21:17 -07:00
										 |  |  |     ...     import pdb; pdb.Pdb(nosigint=True, readrc=False).set_trace() | 
					
						
							| 
									
										
										
										
											2013-11-21 11:30:06 -08:00
										 |  |  |     ...     it = test_gen() | 
					
						
							|  |  |  |     ...     try: | 
					
						
							| 
									
										
										
										
											2015-04-01 16:58:19 +03:00
										 |  |  |     ...         if next(it) != 0: | 
					
						
							|  |  |  |     ...             raise AssertionError | 
					
						
							| 
									
										
										
										
											2013-11-21 11:30:06 -08:00
										 |  |  |     ...         next(it) | 
					
						
							|  |  |  |     ...     except StopIteration as ex: | 
					
						
							| 
									
										
										
										
											2015-04-01 16:58:19 +03:00
										 |  |  |     ...         if ex.value != 1: | 
					
						
							|  |  |  |     ...             raise AssertionError | 
					
						
							| 
									
										
										
										
											2013-11-21 11:30:06 -08:00
										 |  |  |     ...     print("finished") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     >>> with PdbTestInput(['step', | 
					
						
							|  |  |  |     ...                    'step', | 
					
						
							|  |  |  |     ...                    'step', | 
					
						
							| 
									
										
										
										
											2024-05-05 07:05:01 -07:00
										 |  |  |     ...                    'step', | 
					
						
							| 
									
										
										
										
											2013-11-21 11:30:06 -08:00
										 |  |  |     ...                    'next', | 
					
						
							|  |  |  |     ...                    'next', | 
					
						
							|  |  |  |     ...                    'step', | 
					
						
							|  |  |  |     ...                    'step', | 
					
						
							|  |  |  |     ...                    'continue']): | 
					
						
							|  |  |  |     ...     test_function() | 
					
						
							| 
									
										
										
										
											2024-05-05 07:05:01 -07:00
										 |  |  |     > <doctest test.test_pdb.test_pdb_next_command_for_generator[1]>(2)test_function() | 
					
						
							|  |  |  |     -> import pdb; pdb.Pdb(nosigint=True, readrc=False).set_trace() | 
					
						
							|  |  |  |     (Pdb) step | 
					
						
							| 
									
										
										
										
											2013-11-21 11:30:06 -08:00
										 |  |  |     > <doctest test.test_pdb.test_pdb_next_command_for_generator[1]>(3)test_function() | 
					
						
							|  |  |  |     -> it = test_gen() | 
					
						
							|  |  |  |     (Pdb) step | 
					
						
							|  |  |  |     > <doctest test.test_pdb.test_pdb_next_command_for_generator[1]>(4)test_function() | 
					
						
							|  |  |  |     -> try: | 
					
						
							|  |  |  |     (Pdb) step | 
					
						
							|  |  |  |     > <doctest test.test_pdb.test_pdb_next_command_for_generator[1]>(5)test_function() | 
					
						
							| 
									
										
										
										
											2015-04-01 16:58:19 +03:00
										 |  |  |     -> if next(it) != 0: | 
					
						
							| 
									
										
										
										
											2013-11-21 11:30:06 -08:00
										 |  |  |     (Pdb) step | 
					
						
							|  |  |  |     --Call-- | 
					
						
							|  |  |  |     > <doctest test.test_pdb.test_pdb_next_command_for_generator[0]>(1)test_gen() | 
					
						
							|  |  |  |     -> def test_gen(): | 
					
						
							|  |  |  |     (Pdb) next | 
					
						
							|  |  |  |     > <doctest test.test_pdb.test_pdb_next_command_for_generator[0]>(2)test_gen() | 
					
						
							|  |  |  |     -> yield 0 | 
					
						
							|  |  |  |     (Pdb) next | 
					
						
							|  |  |  |     > <doctest test.test_pdb.test_pdb_next_command_for_generator[0]>(3)test_gen() | 
					
						
							|  |  |  |     -> return 1 | 
					
						
							|  |  |  |     (Pdb) step | 
					
						
							|  |  |  |     --Return-- | 
					
						
							|  |  |  |     > <doctest test.test_pdb.test_pdb_next_command_for_generator[0]>(3)test_gen()->1 | 
					
						
							|  |  |  |     -> return 1 | 
					
						
							|  |  |  |     (Pdb) step | 
					
						
							|  |  |  |     StopIteration: 1 | 
					
						
							| 
									
										
										
										
											2015-04-01 16:58:19 +03:00
										 |  |  |     > <doctest test.test_pdb.test_pdb_next_command_for_generator[1]>(7)test_function() | 
					
						
							| 
									
										
										
										
											2013-11-21 11:30:06 -08:00
										 |  |  |     -> next(it) | 
					
						
							|  |  |  |     (Pdb) continue | 
					
						
							|  |  |  |     finished | 
					
						
							|  |  |  |     """
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-01-19 16:00:34 +03:00
										 |  |  | if not SKIP_ASYNCIO_TESTS: | 
					
						
							|  |  |  |     def test_pdb_next_command_for_coroutine(): | 
					
						
							|  |  |  |         """Testing skip unwindng stack on yield for coroutines for "next" command
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         >>> import asyncio | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         >>> async def test_coro(): | 
					
						
							|  |  |  |         ...     await asyncio.sleep(0) | 
					
						
							|  |  |  |         ...     await asyncio.sleep(0) | 
					
						
							|  |  |  |         ...     await asyncio.sleep(0) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         >>> async def test_main(): | 
					
						
							|  |  |  |         ...     import pdb; pdb.Pdb(nosigint=True, readrc=False).set_trace() | 
					
						
							|  |  |  |         ...     await test_coro() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         >>> def test_function(): | 
					
						
							|  |  |  |         ...     loop = asyncio.new_event_loop() | 
					
						
							|  |  |  |         ...     loop.run_until_complete(test_main()) | 
					
						
							|  |  |  |         ...     loop.close() | 
					
						
							|  |  |  |         ...     asyncio.set_event_loop_policy(None) | 
					
						
							|  |  |  |         ...     print("finished") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         >>> with PdbTestInput(['step', | 
					
						
							|  |  |  |         ...                    'step', | 
					
						
							| 
									
										
										
										
											2024-05-05 07:05:01 -07:00
										 |  |  |         ...                    'step', | 
					
						
							| 
									
										
										
										
											2024-01-19 16:00:34 +03:00
										 |  |  |         ...                    'next', | 
					
						
							|  |  |  |         ...                    'next', | 
					
						
							|  |  |  |         ...                    'next', | 
					
						
							|  |  |  |         ...                    'step', | 
					
						
							|  |  |  |         ...                    'continue']): | 
					
						
							|  |  |  |         ...     test_function() | 
					
						
							| 
									
										
										
										
											2024-05-05 07:05:01 -07:00
										 |  |  |         > <doctest test.test_pdb.test_pdb_next_command_for_coroutine[2]>(2)test_main() | 
					
						
							|  |  |  |         -> import pdb; pdb.Pdb(nosigint=True, readrc=False).set_trace() | 
					
						
							|  |  |  |         (Pdb) step | 
					
						
							| 
									
										
										
										
											2024-01-19 16:00:34 +03:00
										 |  |  |         > <doctest test.test_pdb.test_pdb_next_command_for_coroutine[2]>(3)test_main() | 
					
						
							|  |  |  |         -> await test_coro() | 
					
						
							|  |  |  |         (Pdb) step | 
					
						
							|  |  |  |         --Call-- | 
					
						
							|  |  |  |         > <doctest test.test_pdb.test_pdb_next_command_for_coroutine[1]>(1)test_coro() | 
					
						
							|  |  |  |         -> async def test_coro(): | 
					
						
							|  |  |  |         (Pdb) step | 
					
						
							|  |  |  |         > <doctest test.test_pdb.test_pdb_next_command_for_coroutine[1]>(2)test_coro() | 
					
						
							|  |  |  |         -> await asyncio.sleep(0) | 
					
						
							|  |  |  |         (Pdb) next | 
					
						
							|  |  |  |         > <doctest test.test_pdb.test_pdb_next_command_for_coroutine[1]>(3)test_coro() | 
					
						
							|  |  |  |         -> await asyncio.sleep(0) | 
					
						
							|  |  |  |         (Pdb) next | 
					
						
							|  |  |  |         > <doctest test.test_pdb.test_pdb_next_command_for_coroutine[1]>(4)test_coro() | 
					
						
							|  |  |  |         -> await asyncio.sleep(0) | 
					
						
							|  |  |  |         (Pdb) next | 
					
						
							|  |  |  |         Internal StopIteration | 
					
						
							|  |  |  |         > <doctest test.test_pdb.test_pdb_next_command_for_coroutine[2]>(3)test_main() | 
					
						
							|  |  |  |         -> await test_coro() | 
					
						
							|  |  |  |         (Pdb) step | 
					
						
							|  |  |  |         --Return-- | 
					
						
							|  |  |  |         > <doctest test.test_pdb.test_pdb_next_command_for_coroutine[2]>(3)test_main()->None | 
					
						
							|  |  |  |         -> await test_coro() | 
					
						
							|  |  |  |         (Pdb) continue | 
					
						
							|  |  |  |         finished | 
					
						
							|  |  |  |         """
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def test_pdb_next_command_for_asyncgen(): | 
					
						
							|  |  |  |         """Testing skip unwindng stack on yield for coroutines for "next" command
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         >>> import asyncio | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         >>> async def agen(): | 
					
						
							|  |  |  |         ...     yield 1 | 
					
						
							|  |  |  |         ...     await asyncio.sleep(0) | 
					
						
							|  |  |  |         ...     yield 2 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         >>> async def test_coro(): | 
					
						
							|  |  |  |         ...     async for x in agen(): | 
					
						
							|  |  |  |         ...         print(x) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         >>> async def test_main(): | 
					
						
							|  |  |  |         ...     import pdb; pdb.Pdb(nosigint=True, readrc=False).set_trace() | 
					
						
							|  |  |  |         ...     await test_coro() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         >>> def test_function(): | 
					
						
							|  |  |  |         ...     loop = asyncio.new_event_loop() | 
					
						
							|  |  |  |         ...     loop.run_until_complete(test_main()) | 
					
						
							|  |  |  |         ...     loop.close() | 
					
						
							|  |  |  |         ...     asyncio.set_event_loop_policy(None) | 
					
						
							|  |  |  |         ...     print("finished") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         >>> with PdbTestInput(['step', | 
					
						
							|  |  |  |         ...                    'step', | 
					
						
							| 
									
										
										
										
											2024-05-05 07:05:01 -07:00
										 |  |  |         ...                    'step', | 
					
						
							| 
									
										
										
										
											2024-01-19 16:00:34 +03:00
										 |  |  |         ...                    'next', | 
					
						
							|  |  |  |         ...                    'next', | 
					
						
							|  |  |  |         ...                    'step', | 
					
						
							|  |  |  |         ...                    'next', | 
					
						
							|  |  |  |         ...                    'continue']): | 
					
						
							|  |  |  |         ...     test_function() | 
					
						
							| 
									
										
										
										
											2024-05-05 07:05:01 -07:00
										 |  |  |         > <doctest test.test_pdb.test_pdb_next_command_for_asyncgen[3]>(2)test_main() | 
					
						
							|  |  |  |         -> import pdb; pdb.Pdb(nosigint=True, readrc=False).set_trace() | 
					
						
							|  |  |  |         (Pdb) step | 
					
						
							| 
									
										
										
										
											2024-01-19 16:00:34 +03:00
										 |  |  |         > <doctest test.test_pdb.test_pdb_next_command_for_asyncgen[3]>(3)test_main() | 
					
						
							|  |  |  |         -> await test_coro() | 
					
						
							|  |  |  |         (Pdb) step | 
					
						
							|  |  |  |         --Call-- | 
					
						
							|  |  |  |         > <doctest test.test_pdb.test_pdb_next_command_for_asyncgen[2]>(1)test_coro() | 
					
						
							|  |  |  |         -> async def test_coro(): | 
					
						
							|  |  |  |         (Pdb) step | 
					
						
							|  |  |  |         > <doctest test.test_pdb.test_pdb_next_command_for_asyncgen[2]>(2)test_coro() | 
					
						
							|  |  |  |         -> async for x in agen(): | 
					
						
							|  |  |  |         (Pdb) next | 
					
						
							|  |  |  |         > <doctest test.test_pdb.test_pdb_next_command_for_asyncgen[2]>(3)test_coro() | 
					
						
							|  |  |  |         -> print(x) | 
					
						
							|  |  |  |         (Pdb) next | 
					
						
							|  |  |  |         1 | 
					
						
							|  |  |  |         > <doctest test.test_pdb.test_pdb_next_command_for_asyncgen[2]>(2)test_coro() | 
					
						
							|  |  |  |         -> async for x in agen(): | 
					
						
							|  |  |  |         (Pdb) step | 
					
						
							|  |  |  |         --Call-- | 
					
						
							|  |  |  |         > <doctest test.test_pdb.test_pdb_next_command_for_asyncgen[1]>(2)agen() | 
					
						
							|  |  |  |         -> yield 1 | 
					
						
							|  |  |  |         (Pdb) next | 
					
						
							|  |  |  |         > <doctest test.test_pdb.test_pdb_next_command_for_asyncgen[1]>(3)agen() | 
					
						
							|  |  |  |         -> await asyncio.sleep(0) | 
					
						
							|  |  |  |         (Pdb) continue | 
					
						
							|  |  |  |         2 | 
					
						
							|  |  |  |         finished | 
					
						
							|  |  |  |         """
 | 
					
						
							| 
									
										
										
										
											2018-01-28 22:43:46 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-11-21 11:30:06 -08:00
										 |  |  | def test_pdb_return_command_for_generator(): | 
					
						
							|  |  |  |     """Testing no unwindng stack on yield for generators
 | 
					
						
							|  |  |  |        for "return" command | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     >>> def test_gen(): | 
					
						
							|  |  |  |     ...     yield 0 | 
					
						
							|  |  |  |     ...     return 1 | 
					
						
							|  |  |  |     ...     yield 2 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     >>> def test_function(): | 
					
						
							| 
									
										
										
										
											2016-09-09 22:21:17 -07:00
										 |  |  |     ...     import pdb; pdb.Pdb(nosigint=True, readrc=False).set_trace() | 
					
						
							| 
									
										
										
										
											2013-11-21 11:30:06 -08:00
										 |  |  |     ...     it = test_gen() | 
					
						
							|  |  |  |     ...     try: | 
					
						
							| 
									
										
										
										
											2015-04-01 16:58:19 +03:00
										 |  |  |     ...         if next(it) != 0: | 
					
						
							|  |  |  |     ...             raise AssertionError | 
					
						
							| 
									
										
										
										
											2013-11-21 11:30:06 -08:00
										 |  |  |     ...         next(it) | 
					
						
							|  |  |  |     ...     except StopIteration as ex: | 
					
						
							| 
									
										
										
										
											2015-04-01 16:58:19 +03:00
										 |  |  |     ...         if ex.value != 1: | 
					
						
							|  |  |  |     ...             raise AssertionError | 
					
						
							| 
									
										
										
										
											2013-11-21 11:30:06 -08:00
										 |  |  |     ...     print("finished") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     >>> with PdbTestInput(['step', | 
					
						
							|  |  |  |     ...                    'step', | 
					
						
							|  |  |  |     ...                    'step', | 
					
						
							| 
									
										
										
										
											2024-05-05 07:05:01 -07:00
										 |  |  |     ...                    'step', | 
					
						
							| 
									
										
										
										
											2013-11-21 11:30:06 -08:00
										 |  |  |     ...                    'return', | 
					
						
							|  |  |  |     ...                    'step', | 
					
						
							|  |  |  |     ...                    'step', | 
					
						
							|  |  |  |     ...                    'continue']): | 
					
						
							|  |  |  |     ...     test_function() | 
					
						
							| 
									
										
										
										
											2024-05-05 07:05:01 -07:00
										 |  |  |     > <doctest test.test_pdb.test_pdb_return_command_for_generator[1]>(2)test_function() | 
					
						
							|  |  |  |     -> import pdb; pdb.Pdb(nosigint=True, readrc=False).set_trace() | 
					
						
							|  |  |  |     (Pdb) step | 
					
						
							| 
									
										
										
										
											2013-11-21 11:30:06 -08:00
										 |  |  |     > <doctest test.test_pdb.test_pdb_return_command_for_generator[1]>(3)test_function() | 
					
						
							|  |  |  |     -> it = test_gen() | 
					
						
							|  |  |  |     (Pdb) step | 
					
						
							|  |  |  |     > <doctest test.test_pdb.test_pdb_return_command_for_generator[1]>(4)test_function() | 
					
						
							|  |  |  |     -> try: | 
					
						
							|  |  |  |     (Pdb) step | 
					
						
							|  |  |  |     > <doctest test.test_pdb.test_pdb_return_command_for_generator[1]>(5)test_function() | 
					
						
							| 
									
										
										
										
											2015-04-01 16:58:19 +03:00
										 |  |  |     -> if next(it) != 0: | 
					
						
							| 
									
										
										
										
											2013-11-21 11:30:06 -08:00
										 |  |  |     (Pdb) step | 
					
						
							|  |  |  |     --Call-- | 
					
						
							|  |  |  |     > <doctest test.test_pdb.test_pdb_return_command_for_generator[0]>(1)test_gen() | 
					
						
							|  |  |  |     -> def test_gen(): | 
					
						
							|  |  |  |     (Pdb) return | 
					
						
							|  |  |  |     StopIteration: 1 | 
					
						
							| 
									
										
										
										
											2015-04-01 16:58:19 +03:00
										 |  |  |     > <doctest test.test_pdb.test_pdb_return_command_for_generator[1]>(7)test_function() | 
					
						
							| 
									
										
										
										
											2013-11-21 11:30:06 -08:00
										 |  |  |     -> next(it) | 
					
						
							|  |  |  |     (Pdb) step | 
					
						
							| 
									
										
										
										
											2015-04-01 16:58:19 +03:00
										 |  |  |     > <doctest test.test_pdb.test_pdb_return_command_for_generator[1]>(8)test_function() | 
					
						
							| 
									
										
										
										
											2013-11-21 11:30:06 -08:00
										 |  |  |     -> except StopIteration as ex: | 
					
						
							|  |  |  |     (Pdb) step | 
					
						
							| 
									
										
										
										
											2015-04-01 16:58:19 +03:00
										 |  |  |     > <doctest test.test_pdb.test_pdb_return_command_for_generator[1]>(9)test_function() | 
					
						
							|  |  |  |     -> if ex.value != 1: | 
					
						
							| 
									
										
										
										
											2013-11-21 11:30:06 -08:00
										 |  |  |     (Pdb) continue | 
					
						
							|  |  |  |     finished | 
					
						
							|  |  |  |     """
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-01-19 16:00:34 +03:00
										 |  |  | if not SKIP_ASYNCIO_TESTS: | 
					
						
							|  |  |  |     def test_pdb_return_command_for_coroutine(): | 
					
						
							|  |  |  |         """Testing no unwindng stack on yield for coroutines for "return" command
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         >>> import asyncio | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         >>> async def test_coro(): | 
					
						
							|  |  |  |         ...     await asyncio.sleep(0) | 
					
						
							|  |  |  |         ...     await asyncio.sleep(0) | 
					
						
							|  |  |  |         ...     await asyncio.sleep(0) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         >>> async def test_main(): | 
					
						
							|  |  |  |         ...     import pdb; pdb.Pdb(nosigint=True, readrc=False).set_trace() | 
					
						
							|  |  |  |         ...     await test_coro() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         >>> def test_function(): | 
					
						
							|  |  |  |         ...     loop = asyncio.new_event_loop() | 
					
						
							|  |  |  |         ...     loop.run_until_complete(test_main()) | 
					
						
							|  |  |  |         ...     loop.close() | 
					
						
							|  |  |  |         ...     asyncio.set_event_loop_policy(None) | 
					
						
							|  |  |  |         ...     print("finished") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         >>> with PdbTestInput(['step', | 
					
						
							|  |  |  |         ...                    'step', | 
					
						
							| 
									
										
										
										
											2024-05-05 07:05:01 -07:00
										 |  |  |         ...                    'step', | 
					
						
							| 
									
										
										
										
											2024-01-19 16:00:34 +03:00
										 |  |  |         ...                    'next', | 
					
						
							|  |  |  |         ...                    'continue']): | 
					
						
							|  |  |  |         ...     test_function() | 
					
						
							| 
									
										
										
										
											2024-05-05 07:05:01 -07:00
										 |  |  |         > <doctest test.test_pdb.test_pdb_return_command_for_coroutine[2]>(2)test_main() | 
					
						
							|  |  |  |         -> import pdb; pdb.Pdb(nosigint=True, readrc=False).set_trace() | 
					
						
							|  |  |  |         (Pdb) step | 
					
						
							| 
									
										
										
										
											2024-01-19 16:00:34 +03:00
										 |  |  |         > <doctest test.test_pdb.test_pdb_return_command_for_coroutine[2]>(3)test_main() | 
					
						
							|  |  |  |         -> await test_coro() | 
					
						
							|  |  |  |         (Pdb) step | 
					
						
							|  |  |  |         --Call-- | 
					
						
							|  |  |  |         > <doctest test.test_pdb.test_pdb_return_command_for_coroutine[1]>(1)test_coro() | 
					
						
							|  |  |  |         -> async def test_coro(): | 
					
						
							|  |  |  |         (Pdb) step | 
					
						
							|  |  |  |         > <doctest test.test_pdb.test_pdb_return_command_for_coroutine[1]>(2)test_coro() | 
					
						
							|  |  |  |         -> await asyncio.sleep(0) | 
					
						
							|  |  |  |         (Pdb) next | 
					
						
							|  |  |  |         > <doctest test.test_pdb.test_pdb_return_command_for_coroutine[1]>(3)test_coro() | 
					
						
							|  |  |  |         -> await asyncio.sleep(0) | 
					
						
							|  |  |  |         (Pdb) continue | 
					
						
							|  |  |  |         finished | 
					
						
							|  |  |  |         """
 | 
					
						
							| 
									
										
										
										
											2018-01-29 01:31:00 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-11-21 11:30:06 -08:00
										 |  |  | def test_pdb_until_command_for_generator(): | 
					
						
							|  |  |  |     """Testing no unwindng stack on yield for generators
 | 
					
						
							| 
									
										
										
										
											2019-07-31 08:16:13 +10:00
										 |  |  |        for "until" command if target breakpoint is not reached | 
					
						
							| 
									
										
										
										
											2013-11-21 11:30:06 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     >>> def test_gen(): | 
					
						
							|  |  |  |     ...     yield 0 | 
					
						
							|  |  |  |     ...     yield 1 | 
					
						
							|  |  |  |     ...     yield 2 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     >>> def test_function(): | 
					
						
							| 
									
										
										
										
											2016-09-09 22:21:17 -07:00
										 |  |  |     ...     import pdb; pdb.Pdb(nosigint=True, readrc=False).set_trace() | 
					
						
							| 
									
										
										
										
											2013-11-21 11:30:06 -08:00
										 |  |  |     ...     for i in test_gen(): | 
					
						
							|  |  |  |     ...         print(i) | 
					
						
							|  |  |  |     ...     print("finished") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     >>> with PdbTestInput(['step', | 
					
						
							| 
									
										
										
										
											2024-05-05 07:05:01 -07:00
										 |  |  |     ...                    'step', | 
					
						
							| 
									
										
										
										
											2013-11-21 11:30:06 -08:00
										 |  |  |     ...                    'until 4', | 
					
						
							|  |  |  |     ...                    'step', | 
					
						
							|  |  |  |     ...                    'step', | 
					
						
							|  |  |  |     ...                    'continue']): | 
					
						
							|  |  |  |     ...     test_function() | 
					
						
							| 
									
										
										
										
											2024-05-05 07:05:01 -07:00
										 |  |  |     > <doctest test.test_pdb.test_pdb_until_command_for_generator[1]>(2)test_function() | 
					
						
							|  |  |  |     -> import pdb; pdb.Pdb(nosigint=True, readrc=False).set_trace() | 
					
						
							|  |  |  |     (Pdb) step | 
					
						
							| 
									
										
										
										
											2013-11-21 11:30:06 -08:00
										 |  |  |     > <doctest test.test_pdb.test_pdb_until_command_for_generator[1]>(3)test_function() | 
					
						
							|  |  |  |     -> for i in test_gen(): | 
					
						
							|  |  |  |     (Pdb) step | 
					
						
							|  |  |  |     --Call-- | 
					
						
							|  |  |  |     > <doctest test.test_pdb.test_pdb_until_command_for_generator[0]>(1)test_gen() | 
					
						
							|  |  |  |     -> def test_gen(): | 
					
						
							|  |  |  |     (Pdb) until 4 | 
					
						
							|  |  |  |     0 | 
					
						
							|  |  |  |     1 | 
					
						
							|  |  |  |     > <doctest test.test_pdb.test_pdb_until_command_for_generator[0]>(4)test_gen() | 
					
						
							|  |  |  |     -> yield 2 | 
					
						
							|  |  |  |     (Pdb) step | 
					
						
							|  |  |  |     --Return-- | 
					
						
							|  |  |  |     > <doctest test.test_pdb.test_pdb_until_command_for_generator[0]>(4)test_gen()->2 | 
					
						
							|  |  |  |     -> yield 2 | 
					
						
							|  |  |  |     (Pdb) step | 
					
						
							|  |  |  |     > <doctest test.test_pdb.test_pdb_until_command_for_generator[1]>(4)test_function() | 
					
						
							|  |  |  |     -> print(i) | 
					
						
							|  |  |  |     (Pdb) continue | 
					
						
							|  |  |  |     2 | 
					
						
							|  |  |  |     finished | 
					
						
							|  |  |  |     """
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-01-19 16:00:34 +03:00
										 |  |  | if not SKIP_ASYNCIO_TESTS: | 
					
						
							|  |  |  |     def test_pdb_until_command_for_coroutine(): | 
					
						
							|  |  |  |         """Testing no unwindng stack for coroutines
 | 
					
						
							|  |  |  |         for "until" command if target breakpoint is not reached | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         >>> import asyncio | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         >>> async def test_coro(): | 
					
						
							|  |  |  |         ...     print(0) | 
					
						
							|  |  |  |         ...     await asyncio.sleep(0) | 
					
						
							|  |  |  |         ...     print(1) | 
					
						
							|  |  |  |         ...     await asyncio.sleep(0) | 
					
						
							|  |  |  |         ...     print(2) | 
					
						
							|  |  |  |         ...     await asyncio.sleep(0) | 
					
						
							|  |  |  |         ...     print(3) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         >>> async def test_main(): | 
					
						
							|  |  |  |         ...     import pdb; pdb.Pdb(nosigint=True, readrc=False).set_trace() | 
					
						
							|  |  |  |         ...     await test_coro() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         >>> def test_function(): | 
					
						
							|  |  |  |         ...     loop = asyncio.new_event_loop() | 
					
						
							|  |  |  |         ...     loop.run_until_complete(test_main()) | 
					
						
							|  |  |  |         ...     loop.close() | 
					
						
							|  |  |  |         ...     asyncio.set_event_loop_policy(None) | 
					
						
							|  |  |  |         ...     print("finished") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         >>> with PdbTestInput(['step', | 
					
						
							| 
									
										
										
										
											2024-05-05 07:05:01 -07:00
										 |  |  |         ...                    'step', | 
					
						
							| 
									
										
										
										
											2024-01-19 16:00:34 +03:00
										 |  |  |         ...                    'until 8', | 
					
						
							|  |  |  |         ...                    'continue']): | 
					
						
							|  |  |  |         ...     test_function() | 
					
						
							| 
									
										
										
										
											2024-05-05 07:05:01 -07:00
										 |  |  |         > <doctest test.test_pdb.test_pdb_until_command_for_coroutine[2]>(2)test_main() | 
					
						
							|  |  |  |         -> import pdb; pdb.Pdb(nosigint=True, readrc=False).set_trace() | 
					
						
							|  |  |  |         (Pdb) step | 
					
						
							| 
									
										
										
										
											2024-01-19 16:00:34 +03:00
										 |  |  |         > <doctest test.test_pdb.test_pdb_until_command_for_coroutine[2]>(3)test_main() | 
					
						
							|  |  |  |         -> await test_coro() | 
					
						
							|  |  |  |         (Pdb) step | 
					
						
							|  |  |  |         --Call-- | 
					
						
							|  |  |  |         > <doctest test.test_pdb.test_pdb_until_command_for_coroutine[1]>(1)test_coro() | 
					
						
							|  |  |  |         -> async def test_coro(): | 
					
						
							|  |  |  |         (Pdb) until 8 | 
					
						
							|  |  |  |         0 | 
					
						
							|  |  |  |         1 | 
					
						
							|  |  |  |         2 | 
					
						
							|  |  |  |         > <doctest test.test_pdb.test_pdb_until_command_for_coroutine[1]>(8)test_coro() | 
					
						
							|  |  |  |         -> print(3) | 
					
						
							|  |  |  |         (Pdb) continue | 
					
						
							|  |  |  |         3 | 
					
						
							|  |  |  |         finished | 
					
						
							|  |  |  |         """
 | 
					
						
							| 
									
										
										
										
											2018-01-29 16:17:45 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-11-21 11:30:06 -08:00
										 |  |  | def test_pdb_next_command_in_generator_for_loop(): | 
					
						
							| 
									
										
										
										
											2016-05-26 05:35:26 +00:00
										 |  |  |     """The next command on returning from a generator controlled by a for loop.
 | 
					
						
							| 
									
										
										
										
											2013-11-21 11:30:06 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     >>> def test_gen(): | 
					
						
							|  |  |  |     ...     yield 0 | 
					
						
							|  |  |  |     ...     return 1 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     >>> def test_function(): | 
					
						
							| 
									
										
										
										
											2016-09-09 22:21:17 -07:00
										 |  |  |     ...     import pdb; pdb.Pdb(nosigint=True, readrc=False).set_trace() | 
					
						
							| 
									
										
										
										
											2013-11-21 11:30:06 -08:00
										 |  |  |     ...     for i in test_gen(): | 
					
						
							|  |  |  |     ...         print('value', i) | 
					
						
							|  |  |  |     ...     x = 123 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-04-28 11:38:29 +01:00
										 |  |  |     >>> reset_Breakpoint() | 
					
						
							| 
									
										
										
										
											2013-11-21 11:30:06 -08:00
										 |  |  |     >>> with PdbTestInput(['break test_gen', | 
					
						
							|  |  |  |     ...                    'continue', | 
					
						
							|  |  |  |     ...                    'next', | 
					
						
							|  |  |  |     ...                    'next', | 
					
						
							|  |  |  |     ...                    'next', | 
					
						
							|  |  |  |     ...                    'continue']): | 
					
						
							|  |  |  |     ...     test_function() | 
					
						
							| 
									
										
										
										
											2024-05-05 07:05:01 -07:00
										 |  |  |     > <doctest test.test_pdb.test_pdb_next_command_in_generator_for_loop[1]>(2)test_function() | 
					
						
							|  |  |  |     -> import pdb; pdb.Pdb(nosigint=True, readrc=False).set_trace() | 
					
						
							| 
									
										
										
										
											2013-11-21 11:30:06 -08:00
										 |  |  |     (Pdb) break test_gen | 
					
						
							| 
									
										
										
										
											2023-10-27 14:01:31 -07:00
										 |  |  |     Breakpoint 1 at <doctest test.test_pdb.test_pdb_next_command_in_generator_for_loop[0]>:2 | 
					
						
							| 
									
										
										
										
											2013-11-21 11:30:06 -08:00
										 |  |  |     (Pdb) continue | 
					
						
							|  |  |  |     > <doctest test.test_pdb.test_pdb_next_command_in_generator_for_loop[0]>(2)test_gen() | 
					
						
							|  |  |  |     -> yield 0 | 
					
						
							|  |  |  |     (Pdb) next | 
					
						
							|  |  |  |     value 0 | 
					
						
							|  |  |  |     > <doctest test.test_pdb.test_pdb_next_command_in_generator_for_loop[0]>(3)test_gen() | 
					
						
							|  |  |  |     -> return 1 | 
					
						
							|  |  |  |     (Pdb) next | 
					
						
							|  |  |  |     Internal StopIteration: 1 | 
					
						
							|  |  |  |     > <doctest test.test_pdb.test_pdb_next_command_in_generator_for_loop[1]>(3)test_function() | 
					
						
							|  |  |  |     -> for i in test_gen(): | 
					
						
							|  |  |  |     (Pdb) next | 
					
						
							|  |  |  |     > <doctest test.test_pdb.test_pdb_next_command_in_generator_for_loop[1]>(5)test_function() | 
					
						
							|  |  |  |     -> x = 123 | 
					
						
							|  |  |  |     (Pdb) continue | 
					
						
							|  |  |  |     """
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def test_pdb_next_command_subiterator(): | 
					
						
							|  |  |  |     """The next command in a generator with a subiterator.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     >>> def test_subgenerator(): | 
					
						
							|  |  |  |     ...     yield 0 | 
					
						
							|  |  |  |     ...     return 1 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     >>> def test_gen(): | 
					
						
							|  |  |  |     ...     x = yield from test_subgenerator() | 
					
						
							|  |  |  |     ...     return x | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     >>> def test_function(): | 
					
						
							| 
									
										
										
										
											2016-09-09 22:21:17 -07:00
										 |  |  |     ...     import pdb; pdb.Pdb(nosigint=True, readrc=False).set_trace() | 
					
						
							| 
									
										
										
										
											2013-11-21 11:30:06 -08:00
										 |  |  |     ...     for i in test_gen(): | 
					
						
							|  |  |  |     ...         print('value', i) | 
					
						
							|  |  |  |     ...     x = 123 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     >>> with PdbTestInput(['step', | 
					
						
							|  |  |  |     ...                    'step', | 
					
						
							| 
									
										
										
										
											2024-05-05 07:05:01 -07:00
										 |  |  |     ...                    'step', | 
					
						
							| 
									
										
										
										
											2013-11-21 11:30:06 -08:00
										 |  |  |     ...                    'next', | 
					
						
							|  |  |  |     ...                    'next', | 
					
						
							|  |  |  |     ...                    'next', | 
					
						
							|  |  |  |     ...                    'continue']): | 
					
						
							|  |  |  |     ...     test_function() | 
					
						
							| 
									
										
										
										
											2024-05-05 07:05:01 -07:00
										 |  |  |     > <doctest test.test_pdb.test_pdb_next_command_subiterator[2]>(2)test_function() | 
					
						
							|  |  |  |     -> import pdb; pdb.Pdb(nosigint=True, readrc=False).set_trace() | 
					
						
							|  |  |  |     (Pdb) step | 
					
						
							| 
									
										
										
										
											2013-11-21 11:30:06 -08:00
										 |  |  |     > <doctest test.test_pdb.test_pdb_next_command_subiterator[2]>(3)test_function() | 
					
						
							|  |  |  |     -> for i in test_gen(): | 
					
						
							|  |  |  |     (Pdb) step | 
					
						
							|  |  |  |     --Call-- | 
					
						
							|  |  |  |     > <doctest test.test_pdb.test_pdb_next_command_subiterator[1]>(1)test_gen() | 
					
						
							|  |  |  |     -> def test_gen(): | 
					
						
							|  |  |  |     (Pdb) step | 
					
						
							|  |  |  |     > <doctest test.test_pdb.test_pdb_next_command_subiterator[1]>(2)test_gen() | 
					
						
							|  |  |  |     -> x = yield from test_subgenerator() | 
					
						
							|  |  |  |     (Pdb) next | 
					
						
							|  |  |  |     value 0 | 
					
						
							|  |  |  |     > <doctest test.test_pdb.test_pdb_next_command_subiterator[1]>(3)test_gen() | 
					
						
							|  |  |  |     -> return x | 
					
						
							|  |  |  |     (Pdb) next | 
					
						
							|  |  |  |     Internal StopIteration: 1 | 
					
						
							|  |  |  |     > <doctest test.test_pdb.test_pdb_next_command_subiterator[2]>(3)test_function() | 
					
						
							|  |  |  |     -> for i in test_gen(): | 
					
						
							|  |  |  |     (Pdb) next | 
					
						
							|  |  |  |     > <doctest test.test_pdb.test_pdb_next_command_subiterator[2]>(5)test_function() | 
					
						
							|  |  |  |     -> x = 123 | 
					
						
							|  |  |  |     (Pdb) continue | 
					
						
							|  |  |  |     """
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-06-15 16:34:42 -07:00
										 |  |  | def test_pdb_multiline_statement(): | 
					
						
							|  |  |  |     """Test for multiline statement
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     >>> def test_function(): | 
					
						
							|  |  |  |     ...     import pdb; pdb.Pdb(nosigint=True, readrc=False).set_trace() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     >>> with PdbTestInput([  # doctest: +NORMALIZE_WHITESPACE | 
					
						
							|  |  |  |     ...     'def f(x):', | 
					
						
							|  |  |  |     ...     '  return x * 2', | 
					
						
							|  |  |  |     ...     '', | 
					
						
							|  |  |  |     ...     'f(2)', | 
					
						
							|  |  |  |     ...     'c' | 
					
						
							|  |  |  |     ... ]): | 
					
						
							|  |  |  |     ...     test_function() | 
					
						
							| 
									
										
										
										
											2024-05-05 07:05:01 -07:00
										 |  |  |     > <doctest test.test_pdb.test_pdb_multiline_statement[0]>(2)test_function() | 
					
						
							|  |  |  |     -> import pdb; pdb.Pdb(nosigint=True, readrc=False).set_trace() | 
					
						
							| 
									
										
										
										
											2023-06-15 16:34:42 -07:00
										 |  |  |     (Pdb) def f(x): | 
					
						
							|  |  |  |     ...     return x * 2 | 
					
						
							|  |  |  |     ... | 
					
						
							|  |  |  |     (Pdb) f(2) | 
					
						
							|  |  |  |     4 | 
					
						
							|  |  |  |     (Pdb) c | 
					
						
							|  |  |  |     """
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-05-06 11:34:13 -07:00
										 |  |  | def test_pdb_closure(): | 
					
						
							|  |  |  |     """Test for all expressions/statements that involve closure
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     >>> k = 0 | 
					
						
							|  |  |  |     >>> g = 1 | 
					
						
							|  |  |  |     >>> def test_function(): | 
					
						
							|  |  |  |     ...     x = 2 | 
					
						
							|  |  |  |     ...     g = 3 | 
					
						
							|  |  |  |     ...     import pdb; pdb.Pdb(nosigint=True, readrc=False).set_trace() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     >>> with PdbTestInput([  # doctest: +NORMALIZE_WHITESPACE | 
					
						
							|  |  |  |     ...     'k', | 
					
						
							|  |  |  |     ...     'g', | 
					
						
							|  |  |  |     ...     'y = y', | 
					
						
							|  |  |  |     ...     'global g; g', | 
					
						
							|  |  |  |     ...     'global g; (lambda: g)()', | 
					
						
							|  |  |  |     ...     '(lambda: x)()', | 
					
						
							|  |  |  |     ...     '(lambda: g)()', | 
					
						
							|  |  |  |     ...     'lst = [n for n in range(10) if (n % x) == 0]', | 
					
						
							|  |  |  |     ...     'lst', | 
					
						
							|  |  |  |     ...     'sum(n for n in lst if n > x)', | 
					
						
							|  |  |  |     ...     'x = 1; raise Exception()', | 
					
						
							|  |  |  |     ...     'x', | 
					
						
							|  |  |  |     ...     'def f():', | 
					
						
							|  |  |  |     ...     '  return x', | 
					
						
							|  |  |  |     ...     '', | 
					
						
							|  |  |  |     ...     'f()', | 
					
						
							|  |  |  |     ...     'c' | 
					
						
							|  |  |  |     ... ]): | 
					
						
							|  |  |  |     ...     test_function() | 
					
						
							|  |  |  |     > <doctest test.test_pdb.test_pdb_closure[2]>(4)test_function() | 
					
						
							|  |  |  |     -> import pdb; pdb.Pdb(nosigint=True, readrc=False).set_trace() | 
					
						
							|  |  |  |     (Pdb) k | 
					
						
							|  |  |  |     0 | 
					
						
							|  |  |  |     (Pdb) g | 
					
						
							|  |  |  |     3 | 
					
						
							|  |  |  |     (Pdb) y = y | 
					
						
							|  |  |  |     *** NameError: name 'y' is not defined | 
					
						
							|  |  |  |     (Pdb) global g; g | 
					
						
							|  |  |  |     1 | 
					
						
							|  |  |  |     (Pdb) global g; (lambda: g)() | 
					
						
							|  |  |  |     1 | 
					
						
							|  |  |  |     (Pdb) (lambda: x)() | 
					
						
							|  |  |  |     2 | 
					
						
							|  |  |  |     (Pdb) (lambda: g)() | 
					
						
							|  |  |  |     3 | 
					
						
							|  |  |  |     (Pdb) lst = [n for n in range(10) if (n % x) == 0] | 
					
						
							|  |  |  |     (Pdb) lst | 
					
						
							|  |  |  |     [0, 2, 4, 6, 8] | 
					
						
							|  |  |  |     (Pdb) sum(n for n in lst if n > x) | 
					
						
							|  |  |  |     18 | 
					
						
							|  |  |  |     (Pdb) x = 1; raise Exception() | 
					
						
							|  |  |  |     *** Exception | 
					
						
							|  |  |  |     (Pdb) x | 
					
						
							|  |  |  |     1 | 
					
						
							|  |  |  |     (Pdb) def f(): | 
					
						
							|  |  |  |     ...     return x | 
					
						
							|  |  |  |     ... | 
					
						
							|  |  |  |     (Pdb) f() | 
					
						
							|  |  |  |     1 | 
					
						
							|  |  |  |     (Pdb) c | 
					
						
							|  |  |  |     """
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-09-04 14:44:40 -07:00
										 |  |  | def test_pdb_show_attribute_and_item(): | 
					
						
							| 
									
										
										
										
											2024-05-06 11:34:13 -07:00
										 |  |  |     """Test for expressions with command prefix
 | 
					
						
							| 
									
										
										
										
											2023-09-04 14:44:40 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |     >>> def test_function(): | 
					
						
							|  |  |  |     ...     n = lambda x: x | 
					
						
							|  |  |  |     ...     c = {"a": 1} | 
					
						
							|  |  |  |     ...     import pdb; pdb.Pdb(nosigint=True, readrc=False).set_trace() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     >>> with PdbTestInput([  # doctest: +NORMALIZE_WHITESPACE | 
					
						
							|  |  |  |     ...     'c["a"]', | 
					
						
							|  |  |  |     ...     'c.get("a")', | 
					
						
							|  |  |  |     ...     'n(1)', | 
					
						
							|  |  |  |     ...     'j=1', | 
					
						
							|  |  |  |     ...     'j+1', | 
					
						
							|  |  |  |     ...     'r"a"', | 
					
						
							|  |  |  |     ...     'next(iter([1]))', | 
					
						
							|  |  |  |     ...     'list((0, 1))', | 
					
						
							|  |  |  |     ...     'c' | 
					
						
							|  |  |  |     ... ]): | 
					
						
							|  |  |  |     ...     test_function() | 
					
						
							| 
									
										
										
										
											2024-05-05 07:05:01 -07:00
										 |  |  |     > <doctest test.test_pdb.test_pdb_show_attribute_and_item[0]>(4)test_function() | 
					
						
							|  |  |  |     -> import pdb; pdb.Pdb(nosigint=True, readrc=False).set_trace() | 
					
						
							| 
									
										
										
										
											2023-09-04 14:44:40 -07:00
										 |  |  |     (Pdb) c["a"] | 
					
						
							|  |  |  |     1 | 
					
						
							|  |  |  |     (Pdb) c.get("a") | 
					
						
							|  |  |  |     1 | 
					
						
							|  |  |  |     (Pdb) n(1) | 
					
						
							|  |  |  |     1 | 
					
						
							|  |  |  |     (Pdb) j=1 | 
					
						
							|  |  |  |     (Pdb) j+1 | 
					
						
							|  |  |  |     2 | 
					
						
							|  |  |  |     (Pdb) r"a" | 
					
						
							|  |  |  |     'a' | 
					
						
							|  |  |  |     (Pdb) next(iter([1])) | 
					
						
							|  |  |  |     1 | 
					
						
							|  |  |  |     (Pdb) list((0, 1)) | 
					
						
							|  |  |  |     [0, 1] | 
					
						
							|  |  |  |     (Pdb) c | 
					
						
							|  |  |  |     """
 | 
					
						
							| 
									
										
										
										
											2023-06-15 16:34:42 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-10-12 20:13:24 +02:00
										 |  |  | def test_pdb_issue_20766(): | 
					
						
							|  |  |  |     """Test for reference leaks when the SIGINT handler is set.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     >>> def test_function(): | 
					
						
							|  |  |  |     ...     i = 1 | 
					
						
							|  |  |  |     ...     while i <= 2: | 
					
						
							|  |  |  |     ...         sess = pdb.Pdb() | 
					
						
							|  |  |  |     ...         sess.set_trace(sys._getframe()) | 
					
						
							|  |  |  |     ...         print('pdb %d: %s' % (i, sess._previous_sigint_handler)) | 
					
						
							|  |  |  |     ...         i += 1 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-04-02 17:15:21 +01:00
										 |  |  |     >>> reset_Breakpoint() | 
					
						
							| 
									
										
										
										
											2016-10-12 20:13:24 +02:00
										 |  |  |     >>> with PdbTestInput(['continue', | 
					
						
							|  |  |  |     ...                    'continue']): | 
					
						
							|  |  |  |     ...     test_function() | 
					
						
							| 
									
										
										
										
											2024-05-05 07:05:01 -07:00
										 |  |  |     > <doctest test.test_pdb.test_pdb_issue_20766[0]>(5)test_function() | 
					
						
							|  |  |  |     -> sess.set_trace(sys._getframe()) | 
					
						
							| 
									
										
										
										
											2016-10-12 20:13:24 +02:00
										 |  |  |     (Pdb) continue | 
					
						
							|  |  |  |     pdb 1: <built-in function default_int_handler> | 
					
						
							| 
									
										
										
										
											2024-05-05 07:05:01 -07:00
										 |  |  |     > <doctest test.test_pdb.test_pdb_issue_20766[0]>(5)test_function() | 
					
						
							|  |  |  |     -> sess.set_trace(sys._getframe()) | 
					
						
							| 
									
										
										
										
											2016-10-12 20:13:24 +02:00
										 |  |  |     (Pdb) continue | 
					
						
							|  |  |  |     pdb 2: <built-in function default_int_handler> | 
					
						
							|  |  |  |     """
 | 
					
						
							| 
									
										
										
										
											2010-07-30 09:14:20 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-06-11 23:17:56 +08:00
										 |  |  | def test_pdb_issue_43318(): | 
					
						
							|  |  |  |     """echo breakpoints cleared with filename:lineno
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     >>> def test_function(): | 
					
						
							|  |  |  |     ...     import pdb; pdb.Pdb(nosigint=True, readrc=False).set_trace() | 
					
						
							|  |  |  |     ...     print(1) | 
					
						
							|  |  |  |     ...     print(2) | 
					
						
							|  |  |  |     ...     print(3) | 
					
						
							|  |  |  |     ...     print(4) | 
					
						
							|  |  |  |     >>> reset_Breakpoint() | 
					
						
							|  |  |  |     >>> with PdbTestInput([  # doctest: +NORMALIZE_WHITESPACE | 
					
						
							|  |  |  |     ...     'break 3', | 
					
						
							|  |  |  |     ...     'clear <doctest test.test_pdb.test_pdb_issue_43318[0]>:3', | 
					
						
							|  |  |  |     ...     'continue' | 
					
						
							|  |  |  |     ... ]): | 
					
						
							|  |  |  |     ...     test_function() | 
					
						
							| 
									
										
										
										
											2024-05-05 07:05:01 -07:00
										 |  |  |     > <doctest test.test_pdb.test_pdb_issue_43318[0]>(2)test_function() | 
					
						
							|  |  |  |     -> import pdb; pdb.Pdb(nosigint=True, readrc=False).set_trace() | 
					
						
							| 
									
										
										
										
											2021-06-11 23:17:56 +08:00
										 |  |  |     (Pdb) break 3 | 
					
						
							|  |  |  |     Breakpoint 1 at <doctest test.test_pdb.test_pdb_issue_43318[0]>:3 | 
					
						
							|  |  |  |     (Pdb) clear <doctest test.test_pdb.test_pdb_issue_43318[0]>:3 | 
					
						
							|  |  |  |     Deleted breakpoint 1 at <doctest test.test_pdb.test_pdb_issue_43318[0]>:3 | 
					
						
							|  |  |  |     (Pdb) continue | 
					
						
							|  |  |  |     1 | 
					
						
							|  |  |  |     2 | 
					
						
							|  |  |  |     3 | 
					
						
							|  |  |  |     4 | 
					
						
							|  |  |  |     """
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-06-23 19:49:13 +05:30
										 |  |  | def test_pdb_issue_gh_91742(): | 
					
						
							|  |  |  |     """See GH-91742
 | 
					
						
							| 
									
										
										
										
											2018-01-06 07:53:05 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-06-23 19:49:13 +05:30
										 |  |  |     >>> def test_function(): | 
					
						
							|  |  |  |     ...    __author__ = "pi" | 
					
						
							|  |  |  |     ...    __version__ = "3.14" | 
					
						
							|  |  |  |     ... | 
					
						
							|  |  |  |     ...    def about(): | 
					
						
							|  |  |  |     ...        '''About''' | 
					
						
							|  |  |  |     ...        print(f"Author: {__author__!r}", | 
					
						
							|  |  |  |     ...            f"Version: {__version__!r}", | 
					
						
							|  |  |  |     ...            sep=" ") | 
					
						
							|  |  |  |     ... | 
					
						
							|  |  |  |     ...    import pdb; pdb.Pdb(nosigint=True, readrc=False).set_trace() | 
					
						
							|  |  |  |     ...    about() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     >>> reset_Breakpoint() | 
					
						
							|  |  |  |     >>> with PdbTestInput([  # doctest: +NORMALIZE_WHITESPACE | 
					
						
							|  |  |  |     ...     'step', | 
					
						
							| 
									
										
										
										
											2024-05-05 07:05:01 -07:00
										 |  |  |     ...     'step', | 
					
						
							| 
									
										
										
										
											2022-06-23 19:49:13 +05:30
										 |  |  |     ...     'next', | 
					
						
							|  |  |  |     ...     'next', | 
					
						
							|  |  |  |     ...     'jump 5', | 
					
						
							|  |  |  |     ...     'continue' | 
					
						
							|  |  |  |     ... ]): | 
					
						
							|  |  |  |     ...     test_function() | 
					
						
							| 
									
										
										
										
											2024-05-05 07:05:01 -07:00
										 |  |  |     > <doctest test.test_pdb.test_pdb_issue_gh_91742[0]>(11)test_function() | 
					
						
							|  |  |  |     -> import pdb; pdb.Pdb(nosigint=True, readrc=False).set_trace() | 
					
						
							|  |  |  |     (Pdb) step | 
					
						
							| 
									
										
										
										
											2022-06-23 19:49:13 +05:30
										 |  |  |     > <doctest test.test_pdb.test_pdb_issue_gh_91742[0]>(12)test_function() | 
					
						
							|  |  |  |     -> about() | 
					
						
							|  |  |  |     (Pdb) step | 
					
						
							|  |  |  |     --Call-- | 
					
						
							|  |  |  |     > <doctest test.test_pdb.test_pdb_issue_gh_91742[0]>(5)about() | 
					
						
							|  |  |  |     -> def about(): | 
					
						
							|  |  |  |     (Pdb) next | 
					
						
							|  |  |  |     > <doctest test.test_pdb.test_pdb_issue_gh_91742[0]>(7)about() | 
					
						
							|  |  |  |     -> print(f"Author: {__author__!r}", | 
					
						
							|  |  |  |     (Pdb) next | 
					
						
							|  |  |  |     > <doctest test.test_pdb.test_pdb_issue_gh_91742[0]>(8)about() | 
					
						
							|  |  |  |     -> f"Version: {__version__!r}", | 
					
						
							|  |  |  |     (Pdb) jump 5 | 
					
						
							|  |  |  |     > <doctest test.test_pdb.test_pdb_issue_gh_91742[0]>(5)about() | 
					
						
							|  |  |  |     -> def about(): | 
					
						
							|  |  |  |     (Pdb) continue | 
					
						
							|  |  |  |     Author: 'pi' Version: '3.14' | 
					
						
							|  |  |  |     """
 | 
					
						
							| 
									
										
										
										
											2022-07-07 12:53:57 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | def test_pdb_issue_gh_94215(): | 
					
						
							|  |  |  |     """See GH-94215
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     Check that frame_setlineno() does not leak references. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     >>> def test_function(): | 
					
						
							|  |  |  |     ...    def func(): | 
					
						
							|  |  |  |     ...        def inner(v): pass | 
					
						
							|  |  |  |     ...        inner( | 
					
						
							|  |  |  |     ...             42 | 
					
						
							|  |  |  |     ...        ) | 
					
						
							|  |  |  |     ... | 
					
						
							|  |  |  |     ...    import pdb; pdb.Pdb(nosigint=True, readrc=False).set_trace() | 
					
						
							|  |  |  |     ...    func() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     >>> reset_Breakpoint() | 
					
						
							|  |  |  |     >>> with PdbTestInput([  # doctest: +NORMALIZE_WHITESPACE | 
					
						
							|  |  |  |     ...     'step', | 
					
						
							| 
									
										
										
										
											2024-05-05 07:05:01 -07:00
										 |  |  |     ...     'step', | 
					
						
							| 
									
										
										
										
											2022-07-07 12:53:57 +02:00
										 |  |  |     ...     'next', | 
					
						
							|  |  |  |     ...     'next', | 
					
						
							|  |  |  |     ...     'jump 3', | 
					
						
							|  |  |  |     ...     'next', | 
					
						
							|  |  |  |     ...     'next', | 
					
						
							|  |  |  |     ...     'jump 3', | 
					
						
							|  |  |  |     ...     'next', | 
					
						
							|  |  |  |     ...     'next', | 
					
						
							|  |  |  |     ...     'jump 3', | 
					
						
							|  |  |  |     ...     'continue' | 
					
						
							|  |  |  |     ... ]): | 
					
						
							|  |  |  |     ...     test_function() | 
					
						
							| 
									
										
										
										
											2024-05-05 07:05:01 -07:00
										 |  |  |     > <doctest test.test_pdb.test_pdb_issue_gh_94215[0]>(8)test_function() | 
					
						
							|  |  |  |     -> import pdb; pdb.Pdb(nosigint=True, readrc=False).set_trace() | 
					
						
							|  |  |  |     (Pdb) step | 
					
						
							| 
									
										
										
										
											2022-07-07 12:53:57 +02:00
										 |  |  |     > <doctest test.test_pdb.test_pdb_issue_gh_94215[0]>(9)test_function() | 
					
						
							|  |  |  |     -> func() | 
					
						
							|  |  |  |     (Pdb) step | 
					
						
							|  |  |  |     --Call-- | 
					
						
							|  |  |  |     > <doctest test.test_pdb.test_pdb_issue_gh_94215[0]>(2)func() | 
					
						
							|  |  |  |     -> def func(): | 
					
						
							|  |  |  |     (Pdb) next | 
					
						
							|  |  |  |     > <doctest test.test_pdb.test_pdb_issue_gh_94215[0]>(3)func() | 
					
						
							|  |  |  |     -> def inner(v): pass | 
					
						
							|  |  |  |     (Pdb) next | 
					
						
							|  |  |  |     > <doctest test.test_pdb.test_pdb_issue_gh_94215[0]>(4)func() | 
					
						
							|  |  |  |     -> inner( | 
					
						
							|  |  |  |     (Pdb) jump 3 | 
					
						
							|  |  |  |     > <doctest test.test_pdb.test_pdb_issue_gh_94215[0]>(3)func() | 
					
						
							|  |  |  |     -> def inner(v): pass | 
					
						
							|  |  |  |     (Pdb) next | 
					
						
							|  |  |  |     > <doctest test.test_pdb.test_pdb_issue_gh_94215[0]>(4)func() | 
					
						
							|  |  |  |     -> inner( | 
					
						
							|  |  |  |     (Pdb) next | 
					
						
							|  |  |  |     > <doctest test.test_pdb.test_pdb_issue_gh_94215[0]>(5)func() | 
					
						
							|  |  |  |     -> 42 | 
					
						
							|  |  |  |     (Pdb) jump 3 | 
					
						
							|  |  |  |     > <doctest test.test_pdb.test_pdb_issue_gh_94215[0]>(3)func() | 
					
						
							|  |  |  |     -> def inner(v): pass | 
					
						
							|  |  |  |     (Pdb) next | 
					
						
							|  |  |  |     > <doctest test.test_pdb.test_pdb_issue_gh_94215[0]>(4)func() | 
					
						
							|  |  |  |     -> inner( | 
					
						
							|  |  |  |     (Pdb) next | 
					
						
							|  |  |  |     > <doctest test.test_pdb.test_pdb_issue_gh_94215[0]>(5)func() | 
					
						
							|  |  |  |     -> 42 | 
					
						
							|  |  |  |     (Pdb) jump 3 | 
					
						
							|  |  |  |     > <doctest test.test_pdb.test_pdb_issue_gh_94215[0]>(3)func() | 
					
						
							|  |  |  |     -> def inner(v): pass | 
					
						
							|  |  |  |     (Pdb) continue | 
					
						
							|  |  |  |     """
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-03-12 16:09:55 -07:00
										 |  |  | def test_pdb_issue_gh_101673(): | 
					
						
							|  |  |  |     """See GH-101673
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-05-26 10:05:23 -07:00
										 |  |  |     Make sure ll and switching frames won't revert local variable assignment | 
					
						
							| 
									
										
										
										
											2023-03-12 16:09:55 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |     >>> def test_function(): | 
					
						
							|  |  |  |     ...    a = 1 | 
					
						
							|  |  |  |     ...    import pdb; pdb.Pdb(nosigint=True, readrc=False).set_trace() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     >>> with PdbTestInput([  # doctest: +NORMALIZE_WHITESPACE | 
					
						
							|  |  |  |     ...     '!a = 2', | 
					
						
							|  |  |  |     ...     'll', | 
					
						
							|  |  |  |     ...     'p a', | 
					
						
							| 
									
										
										
										
											2024-05-26 10:05:23 -07:00
										 |  |  |     ...     'u', | 
					
						
							|  |  |  |     ...     'p a', | 
					
						
							|  |  |  |     ...     'd', | 
					
						
							|  |  |  |     ...     'p a', | 
					
						
							| 
									
										
										
										
											2023-03-12 16:09:55 -07:00
										 |  |  |     ...     'continue' | 
					
						
							|  |  |  |     ... ]): | 
					
						
							|  |  |  |     ...     test_function() | 
					
						
							| 
									
										
										
										
											2024-05-05 07:05:01 -07:00
										 |  |  |     > <doctest test.test_pdb.test_pdb_issue_gh_101673[0]>(3)test_function() | 
					
						
							| 
									
										
										
										
											2023-03-12 16:09:55 -07:00
										 |  |  |     -> import pdb; pdb.Pdb(nosigint=True, readrc=False).set_trace() | 
					
						
							|  |  |  |     (Pdb) !a = 2 | 
					
						
							|  |  |  |     (Pdb) ll | 
					
						
							|  |  |  |       1         def test_function(): | 
					
						
							|  |  |  |       2            a = 1 | 
					
						
							|  |  |  |       3  ->        import pdb; pdb.Pdb(nosigint=True, readrc=False).set_trace() | 
					
						
							|  |  |  |     (Pdb) p a | 
					
						
							|  |  |  |     2 | 
					
						
							| 
									
										
										
										
											2024-05-26 10:05:23 -07:00
										 |  |  |     (Pdb) u | 
					
						
							|  |  |  |     > <doctest test.test_pdb.test_pdb_issue_gh_101673[1]>(11)<module>() | 
					
						
							|  |  |  |     -> test_function() | 
					
						
							|  |  |  |     (Pdb) p a | 
					
						
							|  |  |  |     *** NameError: name 'a' is not defined | 
					
						
							|  |  |  |     (Pdb) d | 
					
						
							|  |  |  |     > <doctest test.test_pdb.test_pdb_issue_gh_101673[0]>(3)test_function() | 
					
						
							|  |  |  |     -> import pdb; pdb.Pdb(nosigint=True, readrc=False).set_trace() | 
					
						
							|  |  |  |     (Pdb) p a | 
					
						
							|  |  |  |     2 | 
					
						
							| 
									
										
										
										
											2023-03-12 16:09:55 -07:00
										 |  |  |     (Pdb) continue | 
					
						
							|  |  |  |     """
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-04-07 10:57:46 -07:00
										 |  |  | def test_pdb_issue_gh_103225(): | 
					
						
							|  |  |  |     """See GH-103225
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     Make sure longlist uses 1-based line numbers in frames that correspond to a module | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     >>> with PdbTestInput([  # doctest: +NORMALIZE_WHITESPACE | 
					
						
							|  |  |  |     ...     'longlist', | 
					
						
							|  |  |  |     ...     'continue' | 
					
						
							|  |  |  |     ... ]): | 
					
						
							|  |  |  |     ...     a = 1 | 
					
						
							|  |  |  |     ...     import pdb; pdb.Pdb(nosigint=True, readrc=False).set_trace() | 
					
						
							|  |  |  |     ...     b = 2 | 
					
						
							| 
									
										
										
										
											2024-05-05 07:05:01 -07:00
										 |  |  |     > <doctest test.test_pdb.test_pdb_issue_gh_103225[0]>(6)<module>() | 
					
						
							|  |  |  |     -> import pdb; pdb.Pdb(nosigint=True, readrc=False).set_trace() | 
					
						
							| 
									
										
										
										
											2023-04-07 10:57:46 -07:00
										 |  |  |     (Pdb) longlist | 
					
						
							|  |  |  |       1     with PdbTestInput([  # doctest: +NORMALIZE_WHITESPACE | 
					
						
							|  |  |  |       2         'longlist', | 
					
						
							|  |  |  |       3         'continue' | 
					
						
							|  |  |  |       4     ]): | 
					
						
							|  |  |  |       5         a = 1 | 
					
						
							| 
									
										
										
										
											2024-05-05 07:05:01 -07:00
										 |  |  |       6 ->      import pdb; pdb.Pdb(nosigint=True, readrc=False).set_trace() | 
					
						
							|  |  |  |       7         b = 2 | 
					
						
							| 
									
										
										
										
											2023-04-07 10:57:46 -07:00
										 |  |  |     (Pdb) continue | 
					
						
							|  |  |  |     """
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-04-14 13:40:31 -07:00
										 |  |  | def test_pdb_issue_gh_101517(): | 
					
						
							|  |  |  |     """See GH-101517
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     Make sure pdb doesn't crash when the exception is caught in a try/except* block | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     >>> def test_function(): | 
					
						
							|  |  |  |     ...     try: | 
					
						
							|  |  |  |     ...         raise KeyError | 
					
						
							|  |  |  |     ...     except* Exception as e: | 
					
						
							|  |  |  |     ...         import pdb; pdb.Pdb(nosigint=True, readrc=False).set_trace() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     >>> with PdbTestInput([  # doctest: +NORMALIZE_WHITESPACE | 
					
						
							|  |  |  |     ...     'continue' | 
					
						
							|  |  |  |     ... ]): | 
					
						
							|  |  |  |     ...    test_function() | 
					
						
							| 
									
										
										
										
											2024-05-05 07:05:01 -07:00
										 |  |  |     > <doctest test.test_pdb.test_pdb_issue_gh_101517[0]>(5)test_function() | 
					
						
							|  |  |  |     -> import pdb; pdb.Pdb(nosigint=True, readrc=False).set_trace() | 
					
						
							| 
									
										
										
										
											2023-04-14 13:40:31 -07:00
										 |  |  |     (Pdb) continue | 
					
						
							|  |  |  |     """
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-09-11 14:37:09 +01:00
										 |  |  | def test_pdb_issue_gh_108976(): | 
					
						
							|  |  |  |     """See GH-108976
 | 
					
						
							|  |  |  |     Make sure setting f_trace_opcodes = True won't crash pdb | 
					
						
							|  |  |  |     >>> def test_function(): | 
					
						
							|  |  |  |     ...     import sys | 
					
						
							|  |  |  |     ...     sys._getframe().f_trace_opcodes = True | 
					
						
							|  |  |  |     ...     import pdb; pdb.Pdb(nosigint=True, readrc=False).set_trace() | 
					
						
							|  |  |  |     ...     a = 1 | 
					
						
							|  |  |  |     >>> with PdbTestInput([  # doctest: +NORMALIZE_WHITESPACE | 
					
						
							|  |  |  |     ...     'continue' | 
					
						
							|  |  |  |     ... ]): | 
					
						
							|  |  |  |     ...    test_function() | 
					
						
							| 
									
										
										
										
											2024-05-05 07:05:01 -07:00
										 |  |  |     > <doctest test.test_pdb.test_pdb_issue_gh_108976[0]>(4)test_function() | 
					
						
							|  |  |  |     -> import pdb; pdb.Pdb(nosigint=True, readrc=False).set_trace() | 
					
						
							| 
									
										
										
										
											2023-09-11 14:37:09 +01:00
										 |  |  |     (Pdb) continue | 
					
						
							|  |  |  |     """
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-11-10 13:13:29 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  | def test_pdb_issue_gh_80731(): | 
					
						
							|  |  |  |     """See GH-80731
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     pdb should correctly print exception info if in an except block. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     >>> with PdbTestInput([  # doctest: +ELLIPSIS | 
					
						
							|  |  |  |     ...     'import sys', | 
					
						
							|  |  |  |     ...     'sys.exc_info()', | 
					
						
							|  |  |  |     ...     'continue' | 
					
						
							|  |  |  |     ... ]): | 
					
						
							|  |  |  |     ...     try: | 
					
						
							|  |  |  |     ...         raise ValueError('Correct') | 
					
						
							|  |  |  |     ...     except ValueError: | 
					
						
							|  |  |  |     ...         import pdb; pdb.Pdb(nosigint=True, readrc=False).set_trace() | 
					
						
							| 
									
										
										
										
											2024-05-05 07:05:01 -07:00
										 |  |  |     > <doctest test.test_pdb.test_pdb_issue_gh_80731[0]>(9)<module>() | 
					
						
							|  |  |  |     -> import pdb; pdb.Pdb(nosigint=True, readrc=False).set_trace() | 
					
						
							| 
									
										
										
										
											2023-11-10 13:13:29 -08:00
										 |  |  |     (Pdb) import sys | 
					
						
							|  |  |  |     (Pdb) sys.exc_info() | 
					
						
							|  |  |  |     (<class 'ValueError'>, ValueError('Correct'), <traceback object at ...>) | 
					
						
							|  |  |  |     (Pdb) continue | 
					
						
							|  |  |  |     """
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-05-11 13:12:02 -04:00
										 |  |  | def test_pdb_ambiguous_statements(): | 
					
						
							|  |  |  |     """See GH-104301
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     Make sure that ambiguous statements prefixed by '!' are properly disambiguated | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     >>> with PdbTestInput([ | 
					
						
							| 
									
										
										
										
											2024-05-05 07:05:01 -07:00
										 |  |  |     ...     's',         # step to the print line | 
					
						
							| 
									
										
										
										
											2023-05-11 13:12:02 -04:00
										 |  |  |     ...     '! n = 42',  # disambiguated statement: reassign the name n | 
					
						
							|  |  |  |     ...     'n',         # advance the debugger into the print() | 
					
						
							|  |  |  |     ...     'continue' | 
					
						
							|  |  |  |     ... ]): | 
					
						
							|  |  |  |     ...     n = -1 | 
					
						
							|  |  |  |     ...     import pdb; pdb.Pdb(nosigint=True, readrc=False).set_trace() | 
					
						
							|  |  |  |     ...     print(f"The value of n is {n}") | 
					
						
							|  |  |  |     > <doctest test.test_pdb.test_pdb_ambiguous_statements[0]>(8)<module>() | 
					
						
							| 
									
										
										
										
											2024-05-05 07:05:01 -07:00
										 |  |  |     -> import pdb; pdb.Pdb(nosigint=True, readrc=False).set_trace() | 
					
						
							|  |  |  |     (Pdb) s | 
					
						
							|  |  |  |     > <doctest test.test_pdb.test_pdb_ambiguous_statements[0]>(9)<module>() | 
					
						
							| 
									
										
										
										
											2023-05-11 13:12:02 -04:00
										 |  |  |     -> print(f"The value of n is {n}") | 
					
						
							|  |  |  |     (Pdb) ! n = 42 | 
					
						
							|  |  |  |     (Pdb) n | 
					
						
							|  |  |  |     The value of n is 42 | 
					
						
							|  |  |  |     > <doctest test.test_pdb.test_pdb_ambiguous_statements[0]>(1)<module>() | 
					
						
							|  |  |  |     -> with PdbTestInput([ | 
					
						
							|  |  |  |     (Pdb) continue | 
					
						
							|  |  |  |     """
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-11-04 12:59:36 -07:00
										 |  |  | def test_pdb_f_trace_lines(): | 
					
						
							|  |  |  |     """GH-80675
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     pdb should work even if f_trace_lines is set to False on some frames. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     >>> reset_Breakpoint() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     >>> def test_function(): | 
					
						
							|  |  |  |     ...     import sys | 
					
						
							|  |  |  |     ...     frame = sys._getframe() | 
					
						
							|  |  |  |     ...     frame.f_trace_lines = False | 
					
						
							|  |  |  |     ...     import pdb; pdb.Pdb(nosigint=True, readrc=False).set_trace() | 
					
						
							|  |  |  |     ...     if frame.f_trace_lines != False: | 
					
						
							|  |  |  |     ...         print("f_trace_lines is not reset after continue!") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     >>> with PdbTestInput([  # doctest: +NORMALIZE_WHITESPACE | 
					
						
							|  |  |  |     ...     'continue' | 
					
						
							|  |  |  |     ... ]): | 
					
						
							|  |  |  |     ...    test_function() | 
					
						
							| 
									
										
										
										
											2024-05-05 07:05:01 -07:00
										 |  |  |     > <doctest test.test_pdb.test_pdb_f_trace_lines[1]>(5)test_function() | 
					
						
							|  |  |  |     -> import pdb; pdb.Pdb(nosigint=True, readrc=False).set_trace() | 
					
						
							| 
									
										
										
										
											2023-11-04 12:59:36 -07:00
										 |  |  |     (Pdb) continue | 
					
						
							|  |  |  |     """
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-10-27 14:01:31 -07:00
										 |  |  | def test_pdb_function_break(): | 
					
						
							|  |  |  |     """Testing the line number of break on function
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     >>> def foo(): pass | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     >>> def bar(): | 
					
						
							|  |  |  |     ... | 
					
						
							|  |  |  |     ...     pass | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     >>> def boo(): | 
					
						
							|  |  |  |     ...     # comments | 
					
						
							|  |  |  |     ...     global x | 
					
						
							|  |  |  |     ...     x = 1 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     >>> def gen(): | 
					
						
							|  |  |  |     ...     yield 42 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     >>> def test_function(): | 
					
						
							|  |  |  |     ...     import pdb; pdb.Pdb(nosigint=True, readrc=False).set_trace() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     >>> with PdbTestInput([  # doctest: +ELLIPSIS +NORMALIZE_WHITESPACE | 
					
						
							|  |  |  |     ...     'break foo', | 
					
						
							|  |  |  |     ...     'break bar', | 
					
						
							|  |  |  |     ...     'break boo', | 
					
						
							|  |  |  |     ...     'break gen', | 
					
						
							|  |  |  |     ...     'continue' | 
					
						
							|  |  |  |     ... ]): | 
					
						
							|  |  |  |     ...     test_function() | 
					
						
							| 
									
										
										
										
											2024-05-05 07:05:01 -07:00
										 |  |  |     > <doctest test.test_pdb.test_pdb_function_break[4]>(2)test_function() | 
					
						
							|  |  |  |     -> import pdb; pdb.Pdb(nosigint=True, readrc=False).set_trace() | 
					
						
							| 
									
										
										
										
											2023-10-27 14:01:31 -07:00
										 |  |  |     (Pdb) break foo | 
					
						
							|  |  |  |     Breakpoint ... at <doctest test.test_pdb.test_pdb_function_break[0]>:1 | 
					
						
							|  |  |  |     (Pdb) break bar | 
					
						
							|  |  |  |     Breakpoint ... at <doctest test.test_pdb.test_pdb_function_break[1]>:3 | 
					
						
							|  |  |  |     (Pdb) break boo | 
					
						
							|  |  |  |     Breakpoint ... at <doctest test.test_pdb.test_pdb_function_break[2]>:4 | 
					
						
							|  |  |  |     (Pdb) break gen | 
					
						
							|  |  |  |     Breakpoint ... at <doctest test.test_pdb.test_pdb_function_break[3]>:2 | 
					
						
							|  |  |  |     (Pdb) continue | 
					
						
							|  |  |  |     """
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-10-11 10:52:14 -07:00
										 |  |  | def test_pdb_issue_gh_65052(): | 
					
						
							|  |  |  |     """See GH-65052
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     args, retval and display should not crash if the object is not displayable | 
					
						
							|  |  |  |     >>> class A: | 
					
						
							|  |  |  |     ...     def __new__(cls): | 
					
						
							|  |  |  |     ...         import pdb; pdb.Pdb(nosigint=True, readrc=False).set_trace() | 
					
						
							|  |  |  |     ...         return object.__new__(cls) | 
					
						
							|  |  |  |     ...     def __init__(self): | 
					
						
							|  |  |  |     ...         import pdb; pdb.Pdb(nosigint=True, readrc=False).set_trace() | 
					
						
							|  |  |  |     ...         self.a = 1 | 
					
						
							|  |  |  |     ...     def __repr__(self): | 
					
						
							|  |  |  |     ...         return self.a | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     >>> def test_function(): | 
					
						
							|  |  |  |     ...     A() | 
					
						
							|  |  |  |     >>> with PdbTestInput([  # doctest: +ELLIPSIS +NORMALIZE_WHITESPACE | 
					
						
							|  |  |  |     ...     's', | 
					
						
							| 
									
										
										
										
											2024-05-05 07:05:01 -07:00
										 |  |  |     ...     's', | 
					
						
							| 
									
										
										
										
											2023-10-11 10:52:14 -07:00
										 |  |  |     ...     'retval', | 
					
						
							|  |  |  |     ...     'continue', | 
					
						
							|  |  |  |     ...     'args', | 
					
						
							|  |  |  |     ...     'display self', | 
					
						
							|  |  |  |     ...     'display', | 
					
						
							|  |  |  |     ...     'continue', | 
					
						
							|  |  |  |     ... ]): | 
					
						
							|  |  |  |     ...    test_function() | 
					
						
							| 
									
										
										
										
											2024-05-05 07:05:01 -07:00
										 |  |  |     > <doctest test.test_pdb.test_pdb_issue_gh_65052[0]>(3)__new__() | 
					
						
							|  |  |  |     -> import pdb; pdb.Pdb(nosigint=True, readrc=False).set_trace() | 
					
						
							|  |  |  |     (Pdb) s | 
					
						
							| 
									
										
										
										
											2023-10-11 10:52:14 -07:00
										 |  |  |     > <doctest test.test_pdb.test_pdb_issue_gh_65052[0]>(4)__new__() | 
					
						
							|  |  |  |     -> return object.__new__(cls) | 
					
						
							|  |  |  |     (Pdb) s | 
					
						
							|  |  |  |     --Return-- | 
					
						
							|  |  |  |     > <doctest test.test_pdb.test_pdb_issue_gh_65052[0]>(4)__new__()-><A instance at ...> | 
					
						
							|  |  |  |     -> return object.__new__(cls) | 
					
						
							|  |  |  |     (Pdb) retval | 
					
						
							|  |  |  |     *** repr(retval) failed: AttributeError: 'A' object has no attribute 'a' *** | 
					
						
							|  |  |  |     (Pdb) continue | 
					
						
							| 
									
										
										
										
											2024-05-05 07:05:01 -07:00
										 |  |  |     > <doctest test.test_pdb.test_pdb_issue_gh_65052[0]>(6)__init__() | 
					
						
							|  |  |  |     -> import pdb; pdb.Pdb(nosigint=True, readrc=False).set_trace() | 
					
						
							| 
									
										
										
										
											2023-10-11 10:52:14 -07:00
										 |  |  |     (Pdb) args | 
					
						
							|  |  |  |     self = *** repr(self) failed: AttributeError: 'A' object has no attribute 'a' *** | 
					
						
							|  |  |  |     (Pdb) display self | 
					
						
							|  |  |  |     display self: *** repr(self) failed: AttributeError: 'A' object has no attribute 'a' *** | 
					
						
							|  |  |  |     (Pdb) display | 
					
						
							|  |  |  |     Currently displaying: | 
					
						
							|  |  |  |     self: *** repr(self) failed: AttributeError: 'A' object has no attribute 'a' *** | 
					
						
							|  |  |  |     (Pdb) continue | 
					
						
							|  |  |  |     """
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-07-07 12:53:57 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-03-22 12:04:36 +02:00
										 |  |  | @support.requires_subprocess() | 
					
						
							| 
									
										
										
										
											2010-07-30 14:16:43 +00:00
										 |  |  | class PdbTestCase(unittest.TestCase): | 
					
						
							| 
									
										
										
										
											2018-01-06 07:53:05 +00:00
										 |  |  |     def tearDown(self): | 
					
						
							| 
									
										
										
										
											2020-08-04 23:51:43 +08:00
										 |  |  |         os_helper.unlink(os_helper.TESTFN) | 
					
						
							| 
									
										
										
										
											2010-07-30 14:16:43 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-05-06 03:41:24 +02:00
										 |  |  |     @unittest.skipIf(sys.flags.safe_path, | 
					
						
							|  |  |  |                      'PYTHONSAFEPATH changes default sys.path') | 
					
						
							| 
									
										
										
										
											2023-11-27 14:11:40 -09:00
										 |  |  |     def _run_pdb(self, pdb_args, commands, | 
					
						
							|  |  |  |                  expected_returncode=0, | 
					
						
							|  |  |  |                  extra_env=None): | 
					
						
							| 
									
										
										
										
											2020-08-04 23:51:43 +08:00
										 |  |  |         self.addCleanup(os_helper.rmtree, '__pycache__') | 
					
						
							| 
									
										
										
										
											2018-01-06 07:53:05 +00:00
										 |  |  |         cmd = [sys.executable, '-m', 'pdb'] + pdb_args | 
					
						
							| 
									
										
										
										
											2023-11-27 14:11:40 -09:00
										 |  |  |         if extra_env is not None: | 
					
						
							|  |  |  |             env = os.environ | extra_env | 
					
						
							|  |  |  |         else: | 
					
						
							|  |  |  |             env = os.environ | 
					
						
							| 
									
										
										
										
											2018-01-06 07:53:05 +00:00
										 |  |  |         with subprocess.Popen( | 
					
						
							|  |  |  |                 cmd, | 
					
						
							|  |  |  |                 stdout=subprocess.PIPE, | 
					
						
							|  |  |  |                 stdin=subprocess.PIPE, | 
					
						
							| 
									
										
										
										
											2024-03-28 11:23:29 -07:00
										 |  |  |                 stderr=subprocess.PIPE, | 
					
						
							| 
									
										
										
										
											2023-11-27 14:11:40 -09:00
										 |  |  |                 env = {**env, 'PYTHONIOENCODING': 'utf-8'} | 
					
						
							| 
									
										
										
										
											2018-01-06 07:53:05 +00:00
										 |  |  |         ) as proc: | 
					
						
							| 
									
										
										
										
											2012-05-01 10:07:49 +08:00
										 |  |  |             stdout, stderr = proc.communicate(str.encode(commands)) | 
					
						
							| 
									
										
										
										
											2024-03-28 11:23:29 -07:00
										 |  |  |         stdout = bytes.decode(stdout) if isinstance(stdout, bytes) else stdout | 
					
						
							|  |  |  |         stderr = bytes.decode(stderr) if isinstance(stderr, bytes) else stderr | 
					
						
							| 
									
										
										
										
											2022-07-07 12:53:57 +02:00
										 |  |  |         self.assertEqual( | 
					
						
							|  |  |  |             proc.returncode, | 
					
						
							|  |  |  |             expected_returncode, | 
					
						
							|  |  |  |             f"Unexpected return code\nstdout: {stdout}\nstderr: {stderr}" | 
					
						
							|  |  |  |         ) | 
					
						
							| 
									
										
										
										
											2012-05-01 10:07:49 +08:00
										 |  |  |         return stdout, stderr | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-11-27 14:11:40 -09:00
										 |  |  |     def run_pdb_script(self, script, commands, | 
					
						
							|  |  |  |                        expected_returncode=0, | 
					
						
							| 
									
										
										
										
											2024-03-11 14:27:00 -07:00
										 |  |  |                        extra_env=None, | 
					
						
							|  |  |  |                        pdbrc=None, | 
					
						
							|  |  |  |                        remove_home=False): | 
					
						
							| 
									
										
										
										
											2018-01-06 07:53:05 +00:00
										 |  |  |         """Run 'script' lines with pdb and the pdb 'commands'.""" | 
					
						
							|  |  |  |         filename = 'main.py' | 
					
						
							|  |  |  |         with open(filename, 'w') as f: | 
					
						
							|  |  |  |             f.write(textwrap.dedent(script)) | 
					
						
							| 
									
										
										
										
											2024-03-11 14:27:00 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |         if pdbrc is not None: | 
					
						
							|  |  |  |             with open('.pdbrc', 'w') as f: | 
					
						
							|  |  |  |                 f.write(textwrap.dedent(pdbrc)) | 
					
						
							|  |  |  |             self.addCleanup(os_helper.unlink, '.pdbrc') | 
					
						
							| 
									
										
										
										
											2020-08-04 23:51:43 +08:00
										 |  |  |         self.addCleanup(os_helper.unlink, filename) | 
					
						
							| 
									
										
										
										
											2024-03-11 14:27:00 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |         homesave = None | 
					
						
							|  |  |  |         if remove_home: | 
					
						
							|  |  |  |             homesave = os.environ.pop('HOME', None) | 
					
						
							|  |  |  |         try: | 
					
						
							|  |  |  |             stdout, stderr = self._run_pdb([filename], commands, expected_returncode, extra_env) | 
					
						
							|  |  |  |         finally: | 
					
						
							|  |  |  |             if homesave is not None: | 
					
						
							|  |  |  |                 os.environ['HOME'] = homesave | 
					
						
							|  |  |  |         return stdout, stderr | 
					
						
							| 
									
										
										
										
											2018-01-06 07:53:05 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def run_pdb_module(self, script, commands): | 
					
						
							|  |  |  |         """Runs the script code as part of a module""" | 
					
						
							|  |  |  |         self.module_name = 't_main' | 
					
						
							| 
									
										
										
										
											2020-08-04 23:51:43 +08:00
										 |  |  |         os_helper.rmtree(self.module_name) | 
					
						
							| 
									
										
										
										
											2018-01-06 07:53:05 +00:00
										 |  |  |         main_file = self.module_name + '/__main__.py' | 
					
						
							|  |  |  |         init_file = self.module_name + '/__init__.py' | 
					
						
							|  |  |  |         os.mkdir(self.module_name) | 
					
						
							|  |  |  |         with open(init_file, 'w') as f: | 
					
						
							|  |  |  |             pass | 
					
						
							|  |  |  |         with open(main_file, 'w') as f: | 
					
						
							|  |  |  |             f.write(textwrap.dedent(script)) | 
					
						
							| 
									
										
										
										
											2020-08-04 23:51:43 +08:00
										 |  |  |         self.addCleanup(os_helper.rmtree, self.module_name) | 
					
						
							| 
									
										
										
										
											2018-01-06 07:53:05 +00:00
										 |  |  |         return self._run_pdb(['-m', self.module_name], commands) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-10-13 20:51:47 +02:00
										 |  |  |     def _assert_find_function(self, file_content, func_name, expected): | 
					
						
							| 
									
										
										
										
											2020-08-04 23:51:43 +08:00
										 |  |  |         with open(os_helper.TESTFN, 'wb') as f: | 
					
						
							| 
									
										
										
										
											2013-10-13 20:51:47 +02:00
										 |  |  |             f.write(file_content) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         expected = None if not expected else ( | 
					
						
							| 
									
										
										
										
											2020-08-04 23:51:43 +08:00
										 |  |  |             expected[0], os_helper.TESTFN, expected[1]) | 
					
						
							| 
									
										
										
										
											2013-10-13 20:51:47 +02:00
										 |  |  |         self.assertEqual( | 
					
						
							| 
									
										
										
										
											2020-08-04 23:51:43 +08:00
										 |  |  |             expected, pdb.find_function(func_name, os_helper.TESTFN)) | 
					
						
							| 
									
										
										
										
											2013-10-13 20:51:47 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def test_find_function_empty_file(self): | 
					
						
							| 
									
										
										
										
											2020-06-21 11:07:50 +03:00
										 |  |  |         self._assert_find_function(b'', 'foo', None) | 
					
						
							| 
									
										
										
										
											2013-10-13 20:51:47 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def test_find_function_found(self): | 
					
						
							|  |  |  |         self._assert_find_function( | 
					
						
							|  |  |  |             """\
 | 
					
						
							| 
									
										
										
										
											2020-06-21 11:07:50 +03:00
										 |  |  | def foo(): | 
					
						
							|  |  |  |     pass | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def bœr(): | 
					
						
							|  |  |  |     pass | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def quux(): | 
					
						
							|  |  |  |     pass | 
					
						
							|  |  |  | """.encode(),
 | 
					
						
							|  |  |  |             'bœr', | 
					
						
							| 
									
										
										
										
											2024-01-31 05:03:05 -08:00
										 |  |  |             ('bœr', 5), | 
					
						
							| 
									
										
										
										
											2020-06-21 11:07:50 +03:00
										 |  |  |         ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def test_find_function_found_with_encoding_cookie(self): | 
					
						
							|  |  |  |         self._assert_find_function( | 
					
						
							|  |  |  |             """\
 | 
					
						
							|  |  |  | # coding: iso-8859-15 | 
					
						
							|  |  |  | def foo(): | 
					
						
							|  |  |  |     pass | 
					
						
							| 
									
										
										
										
											2013-10-13 20:51:47 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-06-21 11:07:50 +03:00
										 |  |  | def bœr(): | 
					
						
							|  |  |  |     pass | 
					
						
							| 
									
										
										
										
											2013-10-13 20:51:47 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-06-21 11:07:50 +03:00
										 |  |  | def quux(): | 
					
						
							|  |  |  |     pass | 
					
						
							|  |  |  | """.encode('iso-8859-15'),
 | 
					
						
							|  |  |  |             'bœr', | 
					
						
							| 
									
										
										
										
											2024-01-31 05:03:05 -08:00
										 |  |  |             ('bœr', 6), | 
					
						
							| 
									
										
										
										
											2020-06-21 11:07:50 +03:00
										 |  |  |         ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def test_find_function_found_with_bom(self): | 
					
						
							|  |  |  |         self._assert_find_function( | 
					
						
							|  |  |  |             codecs.BOM_UTF8 + """\
 | 
					
						
							|  |  |  | def bœr(): | 
					
						
							|  |  |  |     pass | 
					
						
							|  |  |  | """.encode(),
 | 
					
						
							|  |  |  |             'bœr', | 
					
						
							| 
									
										
										
										
											2024-01-31 05:03:05 -08:00
										 |  |  |             ('bœr', 2), | 
					
						
							| 
									
										
										
										
											2013-10-13 20:51:47 +02:00
										 |  |  |         ) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-02-29 13:39:50 -08:00
										 |  |  |     def test_spec(self): | 
					
						
							|  |  |  |         # Test that __main__.__spec__ is set to None when running a script | 
					
						
							|  |  |  |         script = """
 | 
					
						
							|  |  |  |             import __main__ | 
					
						
							|  |  |  |             print(__main__.__spec__) | 
					
						
							|  |  |  |         """
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         commands = "continue" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         stdout, _ = self.run_pdb_script(script, commands) | 
					
						
							|  |  |  |         self.assertIn('None', stdout) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-01-31 05:03:05 -08:00
										 |  |  |     def test_find_function_first_executable_line(self): | 
					
						
							|  |  |  |         code = textwrap.dedent("""\
 | 
					
						
							|  |  |  |             def foo(): pass | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             def bar(): | 
					
						
							|  |  |  |                 pass  # line 4 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             def baz(): | 
					
						
							|  |  |  |                 # comment | 
					
						
							|  |  |  |                 pass  # line 8 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             def mul(): | 
					
						
							|  |  |  |                 # code on multiple lines | 
					
						
							|  |  |  |                 code = compile(   # line 12 | 
					
						
							|  |  |  |                     'def f()', | 
					
						
							|  |  |  |                     '<string>', | 
					
						
							|  |  |  |                     'exec', | 
					
						
							|  |  |  |                 ) | 
					
						
							|  |  |  |         """).encode()
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         self._assert_find_function(code, 'foo', ('foo', 1)) | 
					
						
							|  |  |  |         self._assert_find_function(code, 'bar', ('bar', 4)) | 
					
						
							|  |  |  |         self._assert_find_function(code, 'baz', ('baz', 8)) | 
					
						
							|  |  |  |         self._assert_find_function(code, 'mul', ('mul', 12)) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-07-30 14:16:43 +00:00
										 |  |  |     def test_issue7964(self): | 
					
						
							|  |  |  |         # open the file as binary so we can force \r\n newline | 
					
						
							| 
									
										
										
										
											2020-08-04 23:51:43 +08:00
										 |  |  |         with open(os_helper.TESTFN, 'wb') as f: | 
					
						
							| 
									
										
										
										
											2010-07-30 14:16:43 +00:00
										 |  |  |             f.write(b'print("testing my pdb")\r\n') | 
					
						
							| 
									
										
										
										
											2020-08-04 23:51:43 +08:00
										 |  |  |         cmd = [sys.executable, '-m', 'pdb', os_helper.TESTFN] | 
					
						
							| 
									
										
										
										
											2010-07-30 14:16:43 +00:00
										 |  |  |         proc = subprocess.Popen(cmd, | 
					
						
							|  |  |  |             stdout=subprocess.PIPE, | 
					
						
							|  |  |  |             stdin=subprocess.PIPE, | 
					
						
							| 
									
										
										
										
											2024-03-28 11:23:29 -07:00
										 |  |  |             stderr=subprocess.PIPE, | 
					
						
							| 
									
										
										
										
											2010-07-30 14:16:43 +00:00
										 |  |  |             ) | 
					
						
							| 
									
										
										
										
											2010-11-05 15:38:47 +00:00
										 |  |  |         self.addCleanup(proc.stdout.close) | 
					
						
							| 
									
										
										
										
											2010-07-30 14:16:43 +00:00
										 |  |  |         stdout, stderr = proc.communicate(b'quit\n') | 
					
						
							|  |  |  |         self.assertNotIn(b'SyntaxError', stdout, | 
					
						
							|  |  |  |                          "Got a syntax error running test script under PDB") | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-01-21 17:00:48 +00:00
										 |  |  |     def test_issue46434(self): | 
					
						
							|  |  |  |         # Temporarily patch in an extra help command which doesn't have a | 
					
						
							|  |  |  |         # docstring to emulate what happens in an embeddable distribution | 
					
						
							|  |  |  |         script = """
 | 
					
						
							|  |  |  |             def do_testcmdwithnodocs(self, arg): | 
					
						
							|  |  |  |                 pass | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             import pdb | 
					
						
							|  |  |  |             pdb.Pdb.do_testcmdwithnodocs = do_testcmdwithnodocs | 
					
						
							|  |  |  |         """
 | 
					
						
							|  |  |  |         commands = """
 | 
					
						
							|  |  |  |             continue | 
					
						
							|  |  |  |             help testcmdwithnodocs | 
					
						
							|  |  |  |         """
 | 
					
						
							|  |  |  |         stdout, stderr = self.run_pdb_script(script, commands) | 
					
						
							|  |  |  |         output = (stdout or '') + (stderr or '') | 
					
						
							|  |  |  |         self.assertNotIn('AttributeError', output, | 
					
						
							|  |  |  |                          'Calling help on a command with no docs should be handled gracefully') | 
					
						
							|  |  |  |         self.assertIn("*** No help for 'testcmdwithnodocs'; __doc__ string missing", output, | 
					
						
							|  |  |  |                       'Calling help on a command with no docs should print an error') | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-05-01 10:07:49 +08:00
										 |  |  |     def test_issue13183(self): | 
					
						
							|  |  |  |         script = """
 | 
					
						
							|  |  |  |             from bar import bar | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             def foo(): | 
					
						
							|  |  |  |                 bar() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             def nope(): | 
					
						
							|  |  |  |                 pass | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             def foobar(): | 
					
						
							|  |  |  |                 foo() | 
					
						
							|  |  |  |                 nope() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             foobar() | 
					
						
							|  |  |  |         """
 | 
					
						
							|  |  |  |         commands = """
 | 
					
						
							|  |  |  |             from bar import bar | 
					
						
							|  |  |  |             break bar | 
					
						
							|  |  |  |             continue | 
					
						
							|  |  |  |             step | 
					
						
							|  |  |  |             step | 
					
						
							|  |  |  |             quit | 
					
						
							|  |  |  |         """
 | 
					
						
							|  |  |  |         bar = """
 | 
					
						
							|  |  |  |             def bar(): | 
					
						
							| 
									
										
										
										
											2012-05-02 08:00:22 +08:00
										 |  |  |                 pass | 
					
						
							| 
									
										
										
										
											2012-05-01 10:07:49 +08:00
										 |  |  |         """
 | 
					
						
							|  |  |  |         with open('bar.py', 'w') as f: | 
					
						
							|  |  |  |             f.write(textwrap.dedent(bar)) | 
					
						
							| 
									
										
										
										
											2020-08-04 23:51:43 +08:00
										 |  |  |         self.addCleanup(os_helper.unlink, 'bar.py') | 
					
						
							| 
									
										
										
										
											2018-01-06 07:53:05 +00:00
										 |  |  |         stdout, stderr = self.run_pdb_script(script, commands) | 
					
						
							| 
									
										
										
										
											2012-05-01 09:21:16 +02:00
										 |  |  |         self.assertTrue( | 
					
						
							|  |  |  |             any('main.py(5)foo()->None' in l for l in stdout.splitlines()), | 
					
						
							|  |  |  |             'Fail to step into the caller after a return') | 
					
						
							| 
									
										
										
										
											2012-05-01 10:07:49 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-04-01 23:59:50 +02:00
										 |  |  |     def test_issue13120(self): | 
					
						
							|  |  |  |         # Invoking "continue" on a non-main thread triggered an exception | 
					
						
							|  |  |  |         # inside signal.signal. | 
					
						
							| 
									
										
										
										
											2012-12-04 21:08:28 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-04 23:51:43 +08:00
										 |  |  |         with open(os_helper.TESTFN, 'wb') as f: | 
					
						
							| 
									
										
										
										
											2012-12-04 21:08:28 +02:00
										 |  |  |             f.write(textwrap.dedent("""
 | 
					
						
							|  |  |  |                 import threading | 
					
						
							|  |  |  |                 import pdb | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                 def start_pdb(): | 
					
						
							| 
									
										
										
										
											2016-09-09 22:21:17 -07:00
										 |  |  |                     pdb.Pdb(readrc=False).set_trace() | 
					
						
							| 
									
										
										
										
											2012-12-04 21:08:28 +02:00
										 |  |  |                     x = 1 | 
					
						
							|  |  |  |                     y = 1 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                 t = threading.Thread(target=start_pdb) | 
					
						
							|  |  |  |                 t.start()""").encode('ascii'))
 | 
					
						
							| 
									
										
										
										
											2020-08-04 23:51:43 +08:00
										 |  |  |         cmd = [sys.executable, '-u', os_helper.TESTFN] | 
					
						
							| 
									
										
										
										
											2012-12-04 21:08:28 +02:00
										 |  |  |         proc = subprocess.Popen(cmd, | 
					
						
							|  |  |  |             stdout=subprocess.PIPE, | 
					
						
							|  |  |  |             stdin=subprocess.PIPE, | 
					
						
							| 
									
										
										
										
											2024-03-28 11:23:29 -07:00
										 |  |  |             stderr=subprocess.PIPE, | 
					
						
							| 
									
										
										
										
											2020-06-25 17:56:31 +03:00
										 |  |  |             env={**os.environ, 'PYTHONIOENCODING': 'utf-8'} | 
					
						
							| 
									
										
										
										
											2012-12-04 21:08:28 +02:00
										 |  |  |             ) | 
					
						
							|  |  |  |         self.addCleanup(proc.stdout.close) | 
					
						
							|  |  |  |         stdout, stderr = proc.communicate(b'cont\n') | 
					
						
							| 
									
										
										
										
											2020-06-25 17:56:31 +03:00
										 |  |  |         self.assertNotIn(b'Error', stdout, | 
					
						
							| 
									
										
										
										
											2012-12-04 21:08:28 +02:00
										 |  |  |                          "Got an error running test script under PDB") | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-09-09 12:45:58 +02:00
										 |  |  |     def test_issue36250(self): | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-04 23:51:43 +08:00
										 |  |  |         with open(os_helper.TESTFN, 'wb') as f: | 
					
						
							| 
									
										
										
										
											2019-09-09 12:45:58 +02:00
										 |  |  |             f.write(textwrap.dedent("""
 | 
					
						
							|  |  |  |                 import threading | 
					
						
							|  |  |  |                 import pdb | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                 evt = threading.Event() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                 def start_pdb(): | 
					
						
							|  |  |  |                     evt.wait() | 
					
						
							|  |  |  |                     pdb.Pdb(readrc=False).set_trace() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                 t = threading.Thread(target=start_pdb) | 
					
						
							|  |  |  |                 t.start() | 
					
						
							|  |  |  |                 pdb.Pdb(readrc=False).set_trace() | 
					
						
							|  |  |  |                 evt.set() | 
					
						
							|  |  |  |                 t.join()""").encode('ascii'))
 | 
					
						
							| 
									
										
										
										
											2020-08-04 23:51:43 +08:00
										 |  |  |         cmd = [sys.executable, '-u', os_helper.TESTFN] | 
					
						
							| 
									
										
										
										
											2019-09-09 12:45:58 +02:00
										 |  |  |         proc = subprocess.Popen(cmd, | 
					
						
							|  |  |  |             stdout=subprocess.PIPE, | 
					
						
							|  |  |  |             stdin=subprocess.PIPE, | 
					
						
							| 
									
										
										
										
											2024-03-28 11:23:29 -07:00
										 |  |  |             stderr=subprocess.PIPE, | 
					
						
							| 
									
										
										
										
											2020-06-25 17:56:31 +03:00
										 |  |  |             env = {**os.environ, 'PYTHONIOENCODING': 'utf-8'} | 
					
						
							| 
									
										
										
										
											2019-09-09 12:45:58 +02:00
										 |  |  |             ) | 
					
						
							|  |  |  |         self.addCleanup(proc.stdout.close) | 
					
						
							|  |  |  |         stdout, stderr = proc.communicate(b'cont\ncont\n') | 
					
						
							| 
									
										
										
										
											2020-06-25 17:56:31 +03:00
										 |  |  |         self.assertNotIn(b'Error', stdout, | 
					
						
							| 
									
										
										
										
											2019-09-09 12:45:58 +02:00
										 |  |  |                          "Got an error running test script under PDB") | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-05-04 03:26:40 -07:00
										 |  |  |     @force_not_colorized | 
					
						
							| 
									
										
										
										
											2015-09-05 19:13:26 -04:00
										 |  |  |     def test_issue16180(self): | 
					
						
							|  |  |  |         # A syntax error in the debuggee. | 
					
						
							|  |  |  |         script = "def f: pass\n" | 
					
						
							|  |  |  |         commands = '' | 
					
						
							|  |  |  |         expected = "SyntaxError:" | 
					
						
							| 
									
										
										
										
											2022-07-07 12:53:57 +02:00
										 |  |  |         stdout, stderr = self.run_pdb_script( | 
					
						
							| 
									
										
										
										
											2023-10-15 03:55:00 -07:00
										 |  |  |             script, commands | 
					
						
							| 
									
										
										
										
											2022-07-07 12:53:57 +02:00
										 |  |  |         ) | 
					
						
							| 
									
										
										
										
											2024-03-28 11:23:29 -07:00
										 |  |  |         self.assertIn(expected, stderr, | 
					
						
							| 
									
										
										
										
											2015-09-05 19:13:26 -04:00
										 |  |  |             '\n\nExpected:\n{}\nGot:\n{}\n' | 
					
						
							|  |  |  |             'Fail to handle a syntax error in the debuggee.' | 
					
						
							| 
									
										
										
										
											2024-03-28 11:23:29 -07:00
										 |  |  |             .format(expected, stderr)) | 
					
						
							| 
									
										
										
										
											2015-09-05 19:13:26 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-05-04 03:26:40 -07:00
										 |  |  |     @force_not_colorized | 
					
						
							| 
									
										
										
										
											2023-10-15 03:55:00 -07:00
										 |  |  |     def test_issue84583(self): | 
					
						
							|  |  |  |         # A syntax error from ast.literal_eval should not make pdb exit. | 
					
						
							|  |  |  |         script = "import ast; ast.literal_eval('')\n" | 
					
						
							|  |  |  |         commands = """
 | 
					
						
							|  |  |  |             continue | 
					
						
							|  |  |  |             where | 
					
						
							|  |  |  |             quit | 
					
						
							|  |  |  |         """
 | 
					
						
							|  |  |  |         stdout, stderr = self.run_pdb_script(script, commands) | 
					
						
							| 
									
										
										
										
											2024-03-28 11:23:29 -07:00
										 |  |  |         # The code should appear 3 times in the stdout/stderr: | 
					
						
							|  |  |  |         # 1. when pdb starts (stdout) | 
					
						
							|  |  |  |         # 2. when the exception is raised, in trackback (stderr) | 
					
						
							|  |  |  |         # 3. in where command (stdout) | 
					
						
							|  |  |  |         self.assertEqual(stdout.count("ast.literal_eval('')"), 2) | 
					
						
							|  |  |  |         self.assertEqual(stderr.count("ast.literal_eval('')"), 1) | 
					
						
							| 
									
										
										
										
											2023-10-15 03:55:00 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-04-01 16:25:59 +01:00
										 |  |  |     def test_issue26053(self): | 
					
						
							|  |  |  |         # run command of pdb prompt echoes the correct args | 
					
						
							|  |  |  |         script = "print('hello')" | 
					
						
							|  |  |  |         commands = """
 | 
					
						
							|  |  |  |             continue | 
					
						
							|  |  |  |             run a b c | 
					
						
							|  |  |  |             run d e f | 
					
						
							|  |  |  |             quit | 
					
						
							|  |  |  |         """
 | 
					
						
							|  |  |  |         stdout, stderr = self.run_pdb_script(script, commands) | 
					
						
							| 
									
										
										
										
											2021-04-01 20:05:51 +01:00
										 |  |  |         res = '\n'.join([x.strip() for x in stdout.splitlines()]) | 
					
						
							|  |  |  |         self.assertRegex(res, "Restarting .* with arguments:\na b c") | 
					
						
							|  |  |  |         self.assertRegex(res, "Restarting .* with arguments:\nd e f") | 
					
						
							| 
									
										
										
										
											2015-09-05 19:13:26 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-03-11 14:27:00 -07:00
										 |  |  |     def test_pdbrc_basic(self): | 
					
						
							| 
									
										
										
										
											2016-09-09 22:56:54 -07:00
										 |  |  |         script = textwrap.dedent("""
 | 
					
						
							| 
									
										
										
										
											2024-03-11 14:27:00 -07:00
										 |  |  |             a = 1 | 
					
						
							|  |  |  |             b = 2 | 
					
						
							|  |  |  |         """)
 | 
					
						
							| 
									
										
										
										
											2016-09-09 22:21:17 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-03-11 14:27:00 -07:00
										 |  |  |         pdbrc = textwrap.dedent("""
 | 
					
						
							|  |  |  |             # Comments should be fine | 
					
						
							|  |  |  |             n | 
					
						
							|  |  |  |             p f"{a+8=}" | 
					
						
							| 
									
										
										
										
											2016-09-09 22:56:54 -07:00
										 |  |  |         """)
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-03-11 14:27:00 -07:00
										 |  |  |         stdout, stderr = self.run_pdb_script(script, 'q\n', pdbrc=pdbrc, remove_home=True) | 
					
						
							| 
									
										
										
										
											2024-03-15 02:36:04 -07:00
										 |  |  |         self.assertNotIn("SyntaxError", stdout) | 
					
						
							| 
									
										
										
										
											2024-03-11 14:27:00 -07:00
										 |  |  |         self.assertIn("a+8=9", stdout) | 
					
						
							| 
									
										
										
										
											2024-06-14 11:25:23 -07:00
										 |  |  |         self.assertIn("-> b = 2", stdout) | 
					
						
							| 
									
										
										
										
											2016-09-09 22:21:17 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-03-15 02:36:04 -07:00
										 |  |  |     def test_pdbrc_empty_line(self): | 
					
						
							|  |  |  |         """Test that empty lines in .pdbrc are ignored.""" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         script = textwrap.dedent("""
 | 
					
						
							|  |  |  |             a = 1 | 
					
						
							|  |  |  |             b = 2 | 
					
						
							|  |  |  |             c = 3 | 
					
						
							|  |  |  |         """)
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         pdbrc = textwrap.dedent("""
 | 
					
						
							|  |  |  |             n | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         """)
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         stdout, stderr = self.run_pdb_script(script, 'q\n', pdbrc=pdbrc, remove_home=True) | 
					
						
							|  |  |  |         self.assertIn("b = 2", stdout) | 
					
						
							|  |  |  |         self.assertNotIn("c = 3", stdout) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-03-11 14:27:00 -07:00
										 |  |  |     def test_pdbrc_alias(self): | 
					
						
							|  |  |  |         script = textwrap.dedent("""
 | 
					
						
							|  |  |  |             class A: | 
					
						
							|  |  |  |                 def __init__(self): | 
					
						
							|  |  |  |                     self.attr = 1 | 
					
						
							|  |  |  |             a = A() | 
					
						
							|  |  |  |             b = 2 | 
					
						
							|  |  |  |         """)
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         pdbrc = textwrap.dedent("""
 | 
					
						
							|  |  |  |             alias pi for k in %1.__dict__.keys(): print(f"%1.{k} = {%1.__dict__[k]}") | 
					
						
							|  |  |  |             until 6 | 
					
						
							|  |  |  |             pi a | 
					
						
							|  |  |  |         """)
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         stdout, stderr = self.run_pdb_script(script, 'q\n', pdbrc=pdbrc, remove_home=True) | 
					
						
							|  |  |  |         self.assertIn("a.attr = 1", stdout) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def test_pdbrc_semicolon(self): | 
					
						
							|  |  |  |         script = textwrap.dedent("""
 | 
					
						
							|  |  |  |             class A: | 
					
						
							|  |  |  |                 def __init__(self): | 
					
						
							|  |  |  |                     self.attr = 1 | 
					
						
							|  |  |  |             a = A() | 
					
						
							|  |  |  |             b = 2 | 
					
						
							|  |  |  |         """)
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         pdbrc = textwrap.dedent("""
 | 
					
						
							|  |  |  |             b 5;;c;;n | 
					
						
							|  |  |  |         """)
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         stdout, stderr = self.run_pdb_script(script, 'q\n', pdbrc=pdbrc, remove_home=True) | 
					
						
							|  |  |  |         self.assertIn("-> b = 2", stdout) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def test_pdbrc_commands(self): | 
					
						
							|  |  |  |         script = textwrap.dedent("""
 | 
					
						
							|  |  |  |             class A: | 
					
						
							|  |  |  |                 def __init__(self): | 
					
						
							|  |  |  |                     self.attr = 1 | 
					
						
							|  |  |  |             a = A() | 
					
						
							|  |  |  |             b = 2 | 
					
						
							|  |  |  |         """)
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         pdbrc = textwrap.dedent("""
 | 
					
						
							|  |  |  |             b 6 | 
					
						
							|  |  |  |             commands 1 ;; p a;; end | 
					
						
							|  |  |  |             c | 
					
						
							|  |  |  |         """)
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         stdout, stderr = self.run_pdb_script(script, 'q\n', pdbrc=pdbrc, remove_home=True) | 
					
						
							|  |  |  |         self.assertIn("<__main__.A object at", stdout) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def test_readrc_kwarg(self): | 
					
						
							|  |  |  |         script = textwrap.dedent("""
 | 
					
						
							|  |  |  |             print('hello') | 
					
						
							|  |  |  |         """)
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         stdout, stderr = self.run_pdb_script(script, 'q\n', pdbrc='invalid', remove_home=True) | 
					
						
							|  |  |  |         self.assertIn("NameError: name 'invalid' is not defined", stdout) | 
					
						
							| 
									
										
										
										
											2016-09-09 22:21:17 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-08-02 18:20:14 -04:00
										 |  |  |     def test_readrc_homedir(self): | 
					
						
							|  |  |  |         save_home = os.environ.pop("HOME", None) | 
					
						
							| 
									
										
										
										
											2020-08-04 23:51:43 +08:00
										 |  |  |         with os_helper.temp_dir() as temp_dir, patch("os.path.expanduser"): | 
					
						
							| 
									
										
										
										
											2019-08-02 18:20:14 -04:00
										 |  |  |             rc_path = os.path.join(temp_dir, ".pdbrc") | 
					
						
							|  |  |  |             os.path.expanduser.return_value = rc_path | 
					
						
							|  |  |  |             try: | 
					
						
							|  |  |  |                 with open(rc_path, "w") as f: | 
					
						
							|  |  |  |                     f.write("invalid") | 
					
						
							|  |  |  |                 self.assertEqual(pdb.Pdb().rcLines[0], "invalid") | 
					
						
							|  |  |  |             finally: | 
					
						
							|  |  |  |                 if save_home is not None: | 
					
						
							|  |  |  |                     os.environ["HOME"] = save_home | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-09-22 12:29:42 -04:00
										 |  |  |     def test_header(self): | 
					
						
							|  |  |  |         stdout = StringIO() | 
					
						
							|  |  |  |         header = 'Nobody expects... blah, blah, blah' | 
					
						
							|  |  |  |         with ExitStack() as resources: | 
					
						
							|  |  |  |             resources.enter_context(patch('sys.stdout', stdout)) | 
					
						
							|  |  |  |             resources.enter_context(patch.object(pdb.Pdb, 'set_trace')) | 
					
						
							|  |  |  |             pdb.set_trace(header=header) | 
					
						
							|  |  |  |         self.assertEqual(stdout.getvalue(), header + '\n') | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-01-06 07:53:05 +00:00
										 |  |  |     def test_run_module(self): | 
					
						
							|  |  |  |         script = """print("SUCCESS")""" | 
					
						
							|  |  |  |         commands = """
 | 
					
						
							|  |  |  |             continue | 
					
						
							|  |  |  |             quit | 
					
						
							|  |  |  |         """
 | 
					
						
							|  |  |  |         stdout, stderr = self.run_pdb_module(script, commands) | 
					
						
							|  |  |  |         self.assertTrue(any("SUCCESS" in l for l in stdout.splitlines()), stdout) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def test_module_is_run_as_main(self): | 
					
						
							|  |  |  |         script = """
 | 
					
						
							|  |  |  |             if __name__ == '__main__': | 
					
						
							|  |  |  |                 print("SUCCESS") | 
					
						
							|  |  |  |         """
 | 
					
						
							|  |  |  |         commands = """
 | 
					
						
							|  |  |  |             continue | 
					
						
							|  |  |  |             quit | 
					
						
							|  |  |  |         """
 | 
					
						
							|  |  |  |         stdout, stderr = self.run_pdb_module(script, commands) | 
					
						
							|  |  |  |         self.assertTrue(any("SUCCESS" in l for l in stdout.splitlines()), stdout) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-03-26 18:20:12 -07:00
										 |  |  |     def test_run_module_with_args(self): | 
					
						
							|  |  |  |         commands = """
 | 
					
						
							|  |  |  |             continue | 
					
						
							|  |  |  |         """
 | 
					
						
							|  |  |  |         self._run_pdb(["calendar", "-m"], commands, expected_returncode=2) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         stdout, _ = self._run_pdb(["-m", "calendar", "1"], commands) | 
					
						
							|  |  |  |         self.assertIn("December", stdout) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-01-06 07:53:05 +00:00
										 |  |  |     def test_breakpoint(self): | 
					
						
							|  |  |  |         script = """
 | 
					
						
							|  |  |  |             if __name__ == '__main__': | 
					
						
							|  |  |  |                 pass | 
					
						
							|  |  |  |                 print("SUCCESS") | 
					
						
							|  |  |  |                 pass | 
					
						
							|  |  |  |         """
 | 
					
						
							|  |  |  |         commands = """
 | 
					
						
							|  |  |  |             b 3 | 
					
						
							|  |  |  |             quit | 
					
						
							|  |  |  |         """
 | 
					
						
							|  |  |  |         stdout, stderr = self.run_pdb_module(script, commands) | 
					
						
							|  |  |  |         self.assertTrue(any("Breakpoint 1 at" in l for l in stdout.splitlines()), stdout) | 
					
						
							|  |  |  |         self.assertTrue(all("SUCCESS" not in l for l in stdout.splitlines()), stdout) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def test_run_pdb_with_pdb(self): | 
					
						
							|  |  |  |         commands = """
 | 
					
						
							|  |  |  |             c | 
					
						
							|  |  |  |             quit | 
					
						
							|  |  |  |         """
 | 
					
						
							|  |  |  |         stdout, stderr = self._run_pdb(["-m", "pdb"], commands) | 
					
						
							| 
									
										
										
										
											2018-01-28 04:58:47 +00:00
										 |  |  |         self.assertIn( | 
					
						
							|  |  |  |             pdb._usage, | 
					
						
							|  |  |  |             stdout.replace('\r', '')  # remove \r for windows | 
					
						
							|  |  |  |         ) | 
					
						
							| 
									
										
										
										
											2018-01-06 07:53:05 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def test_module_without_a_main(self): | 
					
						
							|  |  |  |         module_name = 't_main' | 
					
						
							| 
									
										
										
										
											2020-08-04 23:51:43 +08:00
										 |  |  |         os_helper.rmtree(module_name) | 
					
						
							| 
									
										
										
										
											2018-01-06 07:53:05 +00:00
										 |  |  |         init_file = module_name + '/__init__.py' | 
					
						
							|  |  |  |         os.mkdir(module_name) | 
					
						
							| 
									
										
										
										
											2021-09-15 20:19:31 +02:00
										 |  |  |         with open(init_file, 'w'): | 
					
						
							| 
									
										
										
										
											2018-01-06 07:53:05 +00:00
										 |  |  |             pass | 
					
						
							| 
									
										
										
										
											2020-08-04 23:51:43 +08:00
										 |  |  |         self.addCleanup(os_helper.rmtree, module_name) | 
					
						
							| 
									
										
										
										
											2022-07-07 12:53:57 +02:00
										 |  |  |         stdout, stderr = self._run_pdb( | 
					
						
							|  |  |  |             ['-m', module_name], "", expected_returncode=1 | 
					
						
							|  |  |  |         ) | 
					
						
							| 
									
										
										
										
											2023-10-16 12:38:07 +03:00
										 |  |  |         self.assertIn("ImportError: No module named t_main.__main__;", stdout) | 
					
						
							| 
									
										
										
										
											2018-01-06 07:53:05 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-07-27 21:51:42 -04:00
										 |  |  |     def test_package_without_a_main(self): | 
					
						
							|  |  |  |         pkg_name = 't_pkg' | 
					
						
							|  |  |  |         module_name = 't_main' | 
					
						
							|  |  |  |         os_helper.rmtree(pkg_name) | 
					
						
							|  |  |  |         modpath = pkg_name + '/' + module_name | 
					
						
							|  |  |  |         os.makedirs(modpath) | 
					
						
							| 
									
										
										
										
											2021-09-15 20:19:31 +02:00
										 |  |  |         with open(modpath + '/__init__.py', 'w'): | 
					
						
							| 
									
										
										
										
											2021-07-27 21:51:42 -04:00
										 |  |  |             pass | 
					
						
							|  |  |  |         self.addCleanup(os_helper.rmtree, pkg_name) | 
					
						
							| 
									
										
										
										
											2022-07-07 12:53:57 +02:00
										 |  |  |         stdout, stderr = self._run_pdb( | 
					
						
							|  |  |  |             ['-m', modpath.replace('/', '.')], "", expected_returncode=1 | 
					
						
							|  |  |  |         ) | 
					
						
							| 
									
										
										
										
											2021-07-27 21:51:42 -04:00
										 |  |  |         self.assertIn( | 
					
						
							|  |  |  |             "'t_pkg.t_main' is a package and cannot be directly executed", | 
					
						
							|  |  |  |             stdout) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-10-16 12:38:07 +03:00
										 |  |  |     def test_nonexistent_module(self): | 
					
						
							|  |  |  |         assert not os.path.exists(os_helper.TESTFN) | 
					
						
							|  |  |  |         stdout, stderr = self._run_pdb(["-m", os_helper.TESTFN], "", expected_returncode=1) | 
					
						
							|  |  |  |         self.assertIn(f"ImportError: No module named {os_helper.TESTFN}", stdout) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def test_dir_as_script(self): | 
					
						
							|  |  |  |         with os_helper.temp_dir() as temp_dir: | 
					
						
							|  |  |  |             stdout, stderr = self._run_pdb([temp_dir], "", expected_returncode=1) | 
					
						
							|  |  |  |             self.assertIn(f"Error: {temp_dir} is a directory", stdout) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def test_invalid_cmd_line_options(self): | 
					
						
							|  |  |  |         stdout, stderr = self._run_pdb(["-c"], "", expected_returncode=2) | 
					
						
							| 
									
										
										
										
											2024-03-28 11:23:29 -07:00
										 |  |  |         self.assertIn(f"pdb: error: argument -c/--command: expected one argument", stderr.split('\n')[1]) | 
					
						
							| 
									
										
										
										
											2023-10-16 12:38:07 +03:00
										 |  |  |         stdout, stderr = self._run_pdb(["--spam", "-m", "pdb"], "", expected_returncode=2) | 
					
						
							| 
									
										
										
										
											2024-03-28 11:23:29 -07:00
										 |  |  |         self.assertIn(f"pdb: error: unrecognized arguments: --spam", stderr.split('\n')[1]) | 
					
						
							| 
									
										
										
										
											2023-10-16 12:38:07 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-01-06 07:53:05 +00:00
										 |  |  |     def test_blocks_at_first_code_line(self): | 
					
						
							|  |  |  |         script = """
 | 
					
						
							|  |  |  |                 #This is a comment, on line 2 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                 print("SUCCESS") | 
					
						
							|  |  |  |         """
 | 
					
						
							|  |  |  |         commands = """
 | 
					
						
							|  |  |  |             quit | 
					
						
							|  |  |  |         """
 | 
					
						
							|  |  |  |         stdout, stderr = self.run_pdb_module(script, commands) | 
					
						
							|  |  |  |         self.assertTrue(any("__main__.py(4)<module>()" | 
					
						
							|  |  |  |                             in l for l in stdout.splitlines()), stdout) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-01-25 08:48:50 -08:00
										 |  |  |     def test_file_modified_after_execution(self): | 
					
						
							|  |  |  |         script = """
 | 
					
						
							|  |  |  |             print("hello") | 
					
						
							|  |  |  |         """
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         commands = """
 | 
					
						
							|  |  |  |             filename = $_frame.f_code.co_filename | 
					
						
							|  |  |  |             f = open(filename, "w") | 
					
						
							|  |  |  |             f.write("print('goodbye')") | 
					
						
							|  |  |  |             f.close() | 
					
						
							|  |  |  |             ll | 
					
						
							|  |  |  |         """
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         stdout, stderr = self.run_pdb_script(script, commands) | 
					
						
							|  |  |  |         self.assertIn("WARNING:", stdout) | 
					
						
							|  |  |  |         self.assertIn("was edited", stdout) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def test_file_modified_after_execution_with_multiple_instances(self): | 
					
						
							|  |  |  |         script = """
 | 
					
						
							|  |  |  |             import pdb; pdb.Pdb().set_trace() | 
					
						
							|  |  |  |             with open(__file__, "w") as f: | 
					
						
							|  |  |  |                 f.write("print('goodbye')\\n" * 5) | 
					
						
							|  |  |  |             import pdb; pdb.Pdb().set_trace() | 
					
						
							|  |  |  |         """
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         commands = """
 | 
					
						
							|  |  |  |             continue | 
					
						
							|  |  |  |             continue | 
					
						
							|  |  |  |         """
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         filename = 'main.py' | 
					
						
							|  |  |  |         with open(filename, 'w') as f: | 
					
						
							|  |  |  |             f.write(textwrap.dedent(script)) | 
					
						
							|  |  |  |         self.addCleanup(os_helper.unlink, filename) | 
					
						
							|  |  |  |         self.addCleanup(os_helper.rmtree, '__pycache__') | 
					
						
							|  |  |  |         cmd = [sys.executable, filename] | 
					
						
							|  |  |  |         with subprocess.Popen( | 
					
						
							|  |  |  |                 cmd, | 
					
						
							|  |  |  |                 stdout=subprocess.PIPE, | 
					
						
							|  |  |  |                 stdin=subprocess.PIPE, | 
					
						
							| 
									
										
										
										
											2024-03-28 11:23:29 -07:00
										 |  |  |                 stderr=subprocess.PIPE, | 
					
						
							| 
									
										
										
										
											2024-01-25 08:48:50 -08:00
										 |  |  |                 env = {**os.environ, 'PYTHONIOENCODING': 'utf-8'}, | 
					
						
							|  |  |  |         ) as proc: | 
					
						
							|  |  |  |             stdout, _ = proc.communicate(str.encode(commands)) | 
					
						
							|  |  |  |         stdout = stdout and bytes.decode(stdout) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         self.assertEqual(proc.returncode, 0) | 
					
						
							|  |  |  |         self.assertIn("WARNING:", stdout) | 
					
						
							|  |  |  |         self.assertIn("was edited", stdout) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def test_file_modified_after_execution_with_restart(self): | 
					
						
							|  |  |  |         script = """
 | 
					
						
							|  |  |  |             import random | 
					
						
							|  |  |  |             # Any code with a source to step into so this script is not checked | 
					
						
							|  |  |  |             # for changes when it's being changed | 
					
						
							|  |  |  |             random.randint(1, 4) | 
					
						
							|  |  |  |             print("hello") | 
					
						
							|  |  |  |         """
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         commands = """
 | 
					
						
							|  |  |  |             ll | 
					
						
							|  |  |  |             n | 
					
						
							|  |  |  |             s | 
					
						
							|  |  |  |             filename = $_frame.f_back.f_code.co_filename | 
					
						
							|  |  |  |             def change_file(content, filename): | 
					
						
							|  |  |  |                 with open(filename, "w") as f: | 
					
						
							|  |  |  |                     f.write(f"print({content})") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             change_file('world', filename) | 
					
						
							|  |  |  |             restart | 
					
						
							|  |  |  |             ll | 
					
						
							|  |  |  |         """
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         stdout, stderr = self.run_pdb_script(script, commands) | 
					
						
							|  |  |  |         # Make sure the code is running correctly and the file is edited | 
					
						
							|  |  |  |         self.assertIn("hello", stdout) | 
					
						
							|  |  |  |         self.assertIn("world", stdout) | 
					
						
							|  |  |  |         # The file was edited, but restart should clear the state and consider | 
					
						
							|  |  |  |         # the file as up to date | 
					
						
							|  |  |  |         self.assertNotIn("WARNING:", stdout) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-01-06 07:53:05 +00:00
										 |  |  |     def test_relative_imports(self): | 
					
						
							|  |  |  |         self.module_name = 't_main' | 
					
						
							| 
									
										
										
										
											2020-08-04 23:51:43 +08:00
										 |  |  |         os_helper.rmtree(self.module_name) | 
					
						
							| 
									
										
										
										
											2018-01-06 07:53:05 +00:00
										 |  |  |         main_file = self.module_name + '/__main__.py' | 
					
						
							|  |  |  |         init_file = self.module_name + '/__init__.py' | 
					
						
							|  |  |  |         module_file = self.module_name + '/module.py' | 
					
						
							| 
									
										
										
										
											2020-08-04 23:51:43 +08:00
										 |  |  |         self.addCleanup(os_helper.rmtree, self.module_name) | 
					
						
							| 
									
										
										
										
											2018-01-06 07:53:05 +00:00
										 |  |  |         os.mkdir(self.module_name) | 
					
						
							|  |  |  |         with open(init_file, 'w') as f: | 
					
						
							|  |  |  |             f.write(textwrap.dedent("""
 | 
					
						
							|  |  |  |                 top_var = "VAR from top" | 
					
						
							|  |  |  |             """))
 | 
					
						
							|  |  |  |         with open(main_file, 'w') as f: | 
					
						
							|  |  |  |             f.write(textwrap.dedent("""
 | 
					
						
							|  |  |  |                 from . import top_var | 
					
						
							|  |  |  |                 from .module import var | 
					
						
							|  |  |  |                 from . import module | 
					
						
							|  |  |  |                 pass # We'll stop here and print the vars | 
					
						
							|  |  |  |             """))
 | 
					
						
							|  |  |  |         with open(module_file, 'w') as f: | 
					
						
							|  |  |  |             f.write(textwrap.dedent("""
 | 
					
						
							|  |  |  |                 var = "VAR from module" | 
					
						
							|  |  |  |                 var2 = "second var" | 
					
						
							|  |  |  |             """))
 | 
					
						
							|  |  |  |         commands = """
 | 
					
						
							|  |  |  |             b 5 | 
					
						
							|  |  |  |             c | 
					
						
							|  |  |  |             p top_var | 
					
						
							|  |  |  |             p var | 
					
						
							|  |  |  |             p module.var2 | 
					
						
							|  |  |  |             quit | 
					
						
							|  |  |  |         """
 | 
					
						
							|  |  |  |         stdout, _ = self._run_pdb(['-m', self.module_name], commands) | 
					
						
							| 
									
										
										
										
											2018-02-03 06:40:11 +00:00
										 |  |  |         self.assertTrue(any("VAR from module" in l for l in stdout.splitlines()), stdout) | 
					
						
							| 
									
										
										
										
											2018-01-06 07:53:05 +00:00
										 |  |  |         self.assertTrue(any("VAR from top" in l for l in stdout.splitlines())) | 
					
						
							|  |  |  |         self.assertTrue(any("second var" in l for l in stdout.splitlines())) | 
					
						
							| 
									
										
										
										
											2010-07-30 14:16:43 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-02-03 06:40:11 +00:00
										 |  |  |     def test_relative_imports_on_plain_module(self): | 
					
						
							|  |  |  |         # Validates running a plain module. See bpo32691 | 
					
						
							|  |  |  |         self.module_name = 't_main' | 
					
						
							| 
									
										
										
										
											2020-08-04 23:51:43 +08:00
										 |  |  |         os_helper.rmtree(self.module_name) | 
					
						
							| 
									
										
										
										
											2018-02-03 06:40:11 +00:00
										 |  |  |         main_file = self.module_name + '/runme.py' | 
					
						
							|  |  |  |         init_file = self.module_name + '/__init__.py' | 
					
						
							|  |  |  |         module_file = self.module_name + '/module.py' | 
					
						
							| 
									
										
										
										
											2020-08-04 23:51:43 +08:00
										 |  |  |         self.addCleanup(os_helper.rmtree, self.module_name) | 
					
						
							| 
									
										
										
										
											2018-02-03 06:40:11 +00:00
										 |  |  |         os.mkdir(self.module_name) | 
					
						
							|  |  |  |         with open(init_file, 'w') as f: | 
					
						
							|  |  |  |             f.write(textwrap.dedent("""
 | 
					
						
							|  |  |  |                 top_var = "VAR from top" | 
					
						
							|  |  |  |             """))
 | 
					
						
							|  |  |  |         with open(main_file, 'w') as f: | 
					
						
							|  |  |  |             f.write(textwrap.dedent("""
 | 
					
						
							|  |  |  |                 from . import module | 
					
						
							|  |  |  |                 pass # We'll stop here and print the vars | 
					
						
							|  |  |  |             """))
 | 
					
						
							|  |  |  |         with open(module_file, 'w') as f: | 
					
						
							|  |  |  |             f.write(textwrap.dedent("""
 | 
					
						
							|  |  |  |                 var = "VAR from module" | 
					
						
							|  |  |  |             """))
 | 
					
						
							|  |  |  |         commands = """
 | 
					
						
							|  |  |  |             b 3 | 
					
						
							|  |  |  |             c | 
					
						
							|  |  |  |             p module.var | 
					
						
							|  |  |  |             quit | 
					
						
							|  |  |  |         """
 | 
					
						
							|  |  |  |         stdout, _ = self._run_pdb(['-m', self.module_name + '.runme'], commands) | 
					
						
							|  |  |  |         self.assertTrue(any("VAR from module" in l for l in stdout.splitlines()), stdout) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-03-12 04:29:04 +01:00
										 |  |  |     def test_errors_in_command(self): | 
					
						
							|  |  |  |         commands = "\n".join([ | 
					
						
							| 
									
										
										
										
											2023-06-15 16:34:42 -07:00
										 |  |  |             'print(]', | 
					
						
							| 
									
										
										
										
											2019-03-12 04:29:04 +01:00
										 |  |  |             'debug print(', | 
					
						
							|  |  |  |             'debug doesnotexist', | 
					
						
							|  |  |  |             'c', | 
					
						
							|  |  |  |         ]) | 
					
						
							| 
									
										
										
										
											2020-11-12 09:43:29 +00:00
										 |  |  |         stdout, _ = self.run_pdb_script('pass', commands + '\n') | 
					
						
							| 
									
										
										
										
											2019-03-12 04:29:04 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-02-15 21:52:53 +01:00
										 |  |  |         self.assertEqual(stdout.splitlines()[1:], [ | 
					
						
							| 
									
										
										
										
											2020-11-12 09:43:29 +00:00
										 |  |  |             '-> pass', | 
					
						
							| 
									
										
										
										
											2023-06-15 16:34:42 -07:00
										 |  |  |             "(Pdb) *** SyntaxError: closing parenthesis ']' does not match opening " | 
					
						
							|  |  |  |             "parenthesis '('", | 
					
						
							| 
									
										
										
										
											2019-03-12 04:29:04 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |             '(Pdb) ENTERING RECURSIVE DEBUGGER', | 
					
						
							| 
									
										
										
										
											2021-01-19 23:59:33 +00:00
										 |  |  |             '*** SyntaxError: \'(\' was never closed', | 
					
						
							| 
									
										
										
										
											2019-03-12 04:29:04 +01:00
										 |  |  |             'LEAVING RECURSIVE DEBUGGER', | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             '(Pdb) ENTERING RECURSIVE DEBUGGER', | 
					
						
							|  |  |  |             '> <string>(1)<module>()', | 
					
						
							|  |  |  |             "((Pdb)) *** NameError: name 'doesnotexist' is not defined", | 
					
						
							|  |  |  |             'LEAVING RECURSIVE DEBUGGER', | 
					
						
							| 
									
										
										
										
											2019-02-15 21:52:53 +01:00
										 |  |  |             '(Pdb) ', | 
					
						
							|  |  |  |         ]) | 
					
						
							| 
									
										
										
										
											2010-07-30 14:16:43 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-07-03 16:33:35 +01:00
										 |  |  |     def test_issue34266(self): | 
					
						
							|  |  |  |         '''do_run handles exceptions from parsing its arg''' | 
					
						
							|  |  |  |         def check(bad_arg, msg): | 
					
						
							|  |  |  |             commands = "\n".join([ | 
					
						
							|  |  |  |                 f'run {bad_arg}', | 
					
						
							|  |  |  |                 'q', | 
					
						
							|  |  |  |             ]) | 
					
						
							|  |  |  |             stdout, _ = self.run_pdb_script('pass', commands + '\n') | 
					
						
							|  |  |  |             self.assertEqual(stdout.splitlines()[1:], [ | 
					
						
							|  |  |  |                 '-> pass', | 
					
						
							|  |  |  |                 f'(Pdb) *** Cannot run {bad_arg}: {msg}', | 
					
						
							|  |  |  |                 '(Pdb) ', | 
					
						
							|  |  |  |             ]) | 
					
						
							|  |  |  |         check('\\', 'No escaped character') | 
					
						
							|  |  |  |         check('"', 'No closing quotation') | 
					
						
							| 
									
										
										
										
											2021-01-22 01:19:51 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def test_issue42384(self): | 
					
						
							|  |  |  |         '''When running `python foo.py` sys.path[0] is an absolute path. `python -m pdb foo.py` should behave the same''' | 
					
						
							|  |  |  |         script = textwrap.dedent("""
 | 
					
						
							|  |  |  |             import sys | 
					
						
							|  |  |  |             print('sys.path[0] is', sys.path[0]) | 
					
						
							|  |  |  |         """)
 | 
					
						
							|  |  |  |         commands = 'c\nq' | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         with os_helper.temp_cwd() as cwd: | 
					
						
							|  |  |  |             expected = f'(Pdb) sys.path[0] is {os.path.realpath(cwd)}' | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             stdout, stderr = self.run_pdb_script(script, commands) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             self.assertEqual(stdout.split('\n')[2].rstrip('\r'), expected) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     @os_helper.skip_unless_symlink | 
					
						
							|  |  |  |     def test_issue42384_symlink(self): | 
					
						
							|  |  |  |         '''When running `python foo.py` sys.path[0] resolves symlinks. `python -m pdb foo.py` should behave the same''' | 
					
						
							|  |  |  |         script = textwrap.dedent("""
 | 
					
						
							|  |  |  |             import sys | 
					
						
							|  |  |  |             print('sys.path[0] is', sys.path[0]) | 
					
						
							|  |  |  |         """)
 | 
					
						
							|  |  |  |         commands = 'c\nq' | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         with os_helper.temp_cwd() as cwd: | 
					
						
							|  |  |  |             cwd = os.path.realpath(cwd) | 
					
						
							|  |  |  |             dir_one = os.path.join(cwd, 'dir_one') | 
					
						
							|  |  |  |             dir_two = os.path.join(cwd, 'dir_two') | 
					
						
							|  |  |  |             expected = f'(Pdb) sys.path[0] is {dir_one}' | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             os.mkdir(dir_one) | 
					
						
							|  |  |  |             with open(os.path.join(dir_one, 'foo.py'), 'w') as f: | 
					
						
							|  |  |  |                 f.write(script) | 
					
						
							|  |  |  |             os.mkdir(dir_two) | 
					
						
							|  |  |  |             os.symlink(os.path.join(dir_one, 'foo.py'), os.path.join(dir_two, 'foo.py')) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             stdout, stderr = self._run_pdb([os.path.join('dir_two', 'foo.py')], commands) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             self.assertEqual(stdout.split('\n')[2].rstrip('\r'), expected) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-11-27 14:11:40 -09:00
										 |  |  |     def test_safe_path(self): | 
					
						
							|  |  |  |         """ With safe_path set, pdb should not mangle sys.path[0]""" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         script = textwrap.dedent("""
 | 
					
						
							|  |  |  |             import sys | 
					
						
							|  |  |  |             import random | 
					
						
							|  |  |  |             print('sys.path[0] is', sys.path[0]) | 
					
						
							|  |  |  |         """)
 | 
					
						
							|  |  |  |         commands = 'c\n' | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         with os_helper.temp_cwd() as cwd: | 
					
						
							|  |  |  |             stdout, _ = self.run_pdb_script(script, commands, extra_env={'PYTHONSAFEPATH': '1'}) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             unexpected = f'sys.path[0] is {os.path.realpath(cwd)}' | 
					
						
							|  |  |  |             self.assertNotIn(unexpected, stdout) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-01-25 21:08:01 +00:00
										 |  |  |     def test_issue42383(self): | 
					
						
							|  |  |  |         with os_helper.temp_cwd() as cwd: | 
					
						
							|  |  |  |             with open('foo.py', 'w') as f: | 
					
						
							|  |  |  |                 s = textwrap.dedent("""
 | 
					
						
							|  |  |  |                     print('The correct file was executed') | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                     import os | 
					
						
							|  |  |  |                     os.chdir("subdir") | 
					
						
							|  |  |  |                 """)
 | 
					
						
							|  |  |  |                 f.write(s) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             subdir = os.path.join(cwd, 'subdir') | 
					
						
							|  |  |  |             os.mkdir(subdir) | 
					
						
							|  |  |  |             os.mkdir(os.path.join(subdir, 'subdir')) | 
					
						
							|  |  |  |             wrong_file = os.path.join(subdir, 'foo.py') | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             with open(wrong_file, 'w') as f: | 
					
						
							|  |  |  |                 f.write('print("The wrong file was executed")') | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             stdout, stderr = self._run_pdb(['foo.py'], 'c\nc\nq') | 
					
						
							|  |  |  |             expected = '(Pdb) The correct file was executed' | 
					
						
							|  |  |  |             self.assertEqual(stdout.split('\n')[6].rstrip('\r'), expected) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-07-07 12:53:57 +02:00
										 |  |  |     def test_gh_94215_crash(self): | 
					
						
							|  |  |  |         script = """\
 | 
					
						
							|  |  |  |             def func(): | 
					
						
							|  |  |  |                 def inner(v): pass | 
					
						
							|  |  |  |                 inner( | 
					
						
							|  |  |  |                     42 | 
					
						
							|  |  |  |                 ) | 
					
						
							|  |  |  |             func() | 
					
						
							|  |  |  |         """
 | 
					
						
							|  |  |  |         commands = textwrap.dedent("""
 | 
					
						
							|  |  |  |             break func | 
					
						
							|  |  |  |             continue | 
					
						
							|  |  |  |             next | 
					
						
							|  |  |  |             next | 
					
						
							|  |  |  |             jump 2 | 
					
						
							|  |  |  |         """)
 | 
					
						
							|  |  |  |         stdout, stderr = self.run_pdb_script(script, commands) | 
					
						
							|  |  |  |         self.assertFalse(stderr) | 
					
						
							| 
									
										
										
										
											2021-01-22 01:19:51 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-10-25 09:22:53 -04:00
										 |  |  |     def test_gh_93696_frozen_list(self): | 
					
						
							|  |  |  |         frozen_src = """
 | 
					
						
							|  |  |  |         def func(): | 
					
						
							|  |  |  |             x = "Sentinel string for gh-93696" | 
					
						
							|  |  |  |             print(x) | 
					
						
							|  |  |  |         """
 | 
					
						
							|  |  |  |         host_program = """
 | 
					
						
							|  |  |  |         import os | 
					
						
							|  |  |  |         import sys | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         def _create_fake_frozen_module(): | 
					
						
							|  |  |  |             with open('gh93696.py') as f: | 
					
						
							|  |  |  |                 src = f.read() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             # this function has a co_filename as if it were in a frozen module | 
					
						
							|  |  |  |             dummy_mod = compile(src, "<frozen gh93696>", "exec") | 
					
						
							|  |  |  |             func_code = dummy_mod.co_consts[0] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             mod = type(sys)("gh93696") | 
					
						
							|  |  |  |             mod.func = type(lambda: None)(func_code, mod.__dict__) | 
					
						
							|  |  |  |             mod.__file__ = 'gh93696.py' | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             return mod | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         mod = _create_fake_frozen_module() | 
					
						
							|  |  |  |         mod.func() | 
					
						
							|  |  |  |         """
 | 
					
						
							|  |  |  |         commands = """
 | 
					
						
							|  |  |  |             break 20 | 
					
						
							|  |  |  |             continue | 
					
						
							|  |  |  |             step | 
					
						
							|  |  |  |             list | 
					
						
							|  |  |  |             quit | 
					
						
							|  |  |  |         """
 | 
					
						
							|  |  |  |         with open('gh93696.py', 'w') as f: | 
					
						
							|  |  |  |             f.write(textwrap.dedent(frozen_src)) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         with open('gh93696_host.py', 'w') as f: | 
					
						
							|  |  |  |             f.write(textwrap.dedent(host_program)) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         self.addCleanup(os_helper.unlink, 'gh93696.py') | 
					
						
							|  |  |  |         self.addCleanup(os_helper.unlink, 'gh93696_host.py') | 
					
						
							|  |  |  |         stdout, stderr = self._run_pdb(["gh93696_host.py"], commands) | 
					
						
							|  |  |  |         # verify that pdb found the source of the "frozen" function | 
					
						
							|  |  |  |         self.assertIn('x = "Sentinel string for gh-93696"', stdout, "Sentinel statement not found") | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-04-25 22:04:51 -07:00
										 |  |  |     def test_non_utf8_encoding(self): | 
					
						
							|  |  |  |         script_dir = os.path.join(os.path.dirname(__file__), 'encoded_modules') | 
					
						
							|  |  |  |         for filename in os.listdir(script_dir): | 
					
						
							|  |  |  |             if filename.endswith(".py"): | 
					
						
							|  |  |  |                 self._run_pdb([os.path.join(script_dir, filename)], 'q') | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-05-02 13:53:27 -07:00
										 |  |  |     def test_zipapp(self): | 
					
						
							|  |  |  |         with os_helper.temp_dir() as temp_dir: | 
					
						
							|  |  |  |             os.mkdir(os.path.join(temp_dir, 'source')) | 
					
						
							|  |  |  |             script = textwrap.dedent( | 
					
						
							|  |  |  |                 """
 | 
					
						
							|  |  |  |                 def f(x): | 
					
						
							|  |  |  |                     return x + 1 | 
					
						
							|  |  |  |                 f(21 + 21) | 
					
						
							|  |  |  |                 """
 | 
					
						
							|  |  |  |             ) | 
					
						
							|  |  |  |             with open(os.path.join(temp_dir, 'source', '__main__.py'), 'w') as f: | 
					
						
							|  |  |  |                 f.write(script) | 
					
						
							|  |  |  |             zipapp.create_archive(os.path.join(temp_dir, 'source'), | 
					
						
							|  |  |  |                                   os.path.join(temp_dir, 'zipapp.pyz')) | 
					
						
							|  |  |  |             stdout, _ = self._run_pdb([os.path.join(temp_dir, 'zipapp.pyz')], '\n'.join([ | 
					
						
							|  |  |  |                 'b f', | 
					
						
							|  |  |  |                 'c', | 
					
						
							|  |  |  |                 'p x', | 
					
						
							|  |  |  |                 'q' | 
					
						
							|  |  |  |             ])) | 
					
						
							|  |  |  |             self.assertIn('42', stdout) | 
					
						
							|  |  |  |             self.assertIn('return x + 1', stdout) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-05-12 01:26:30 +02:00
										 |  |  | class ChecklineTests(unittest.TestCase): | 
					
						
							|  |  |  |     def setUp(self): | 
					
						
							|  |  |  |         linecache.clearcache()  # Pdb.checkline() uses linecache.getline() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def tearDown(self): | 
					
						
							|  |  |  |         os_helper.unlink(os_helper.TESTFN) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def test_checkline_before_debugging(self): | 
					
						
							|  |  |  |         with open(os_helper.TESTFN, "w") as f: | 
					
						
							|  |  |  |             f.write("print(123)") | 
					
						
							|  |  |  |         db = pdb.Pdb() | 
					
						
							|  |  |  |         self.assertEqual(db.checkline(os_helper.TESTFN, 1), 1) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def test_checkline_after_reset(self): | 
					
						
							|  |  |  |         with open(os_helper.TESTFN, "w") as f: | 
					
						
							|  |  |  |             f.write("print(123)") | 
					
						
							|  |  |  |         db = pdb.Pdb() | 
					
						
							|  |  |  |         db.reset() | 
					
						
							|  |  |  |         self.assertEqual(db.checkline(os_helper.TESTFN, 1), 1) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def test_checkline_is_not_executable(self): | 
					
						
							| 
									
										
										
										
											2021-09-15 20:19:31 +02:00
										 |  |  |         # Test for comments, docstrings and empty lines | 
					
						
							|  |  |  |         s = textwrap.dedent("""
 | 
					
						
							|  |  |  |             # Comment | 
					
						
							|  |  |  |             \"\"\" docstring \"\"\" | 
					
						
							|  |  |  |             ''' docstring ''' | 
					
						
							| 
									
										
										
										
											2021-05-12 01:26:30 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-09-15 20:19:31 +02:00
										 |  |  |         """)
 | 
					
						
							|  |  |  |         with open(os_helper.TESTFN, "w") as f: | 
					
						
							| 
									
										
										
										
											2021-05-12 01:26:30 +02:00
										 |  |  |             f.write(s) | 
					
						
							|  |  |  |         num_lines = len(s.splitlines()) + 2  # Test for EOF | 
					
						
							| 
									
										
										
										
											2021-09-15 20:19:31 +02:00
										 |  |  |         with redirect_stdout(StringIO()): | 
					
						
							|  |  |  |             db = pdb.Pdb() | 
					
						
							|  |  |  |             for lineno in range(num_lines): | 
					
						
							|  |  |  |                 self.assertFalse(db.checkline(os_helper.TESTFN, lineno)) | 
					
						
							| 
									
										
										
										
											2021-05-12 01:26:30 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-11-13 02:23:06 -08:00
										 |  |  | @support.requires_subprocess() | 
					
						
							|  |  |  | class PdbTestReadline(unittest.TestCase): | 
					
						
							|  |  |  |     def setUpClass(): | 
					
						
							|  |  |  |         # Ensure that the readline module is loaded | 
					
						
							|  |  |  |         # If this fails, the test is skipped because SkipTest will be raised | 
					
						
							|  |  |  |         readline = import_module('readline') | 
					
						
							| 
									
										
										
										
											2023-12-01 05:05:55 -09:00
										 |  |  |         if readline.backend == "editline": | 
					
						
							| 
									
										
										
										
											2023-11-13 02:23:06 -08:00
										 |  |  |             raise unittest.SkipTest("libedit readline is not supported for pdb") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def test_basic_completion(self): | 
					
						
							|  |  |  |         script = textwrap.dedent("""
 | 
					
						
							|  |  |  |             import pdb; pdb.Pdb().set_trace() | 
					
						
							|  |  |  |             # Concatenate strings so that the output doesn't appear in the source | 
					
						
							|  |  |  |             print('hello' + '!') | 
					
						
							|  |  |  |         """)
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         # List everything starting with 'co', there should be multiple matches | 
					
						
							|  |  |  |         # then add ntin and complete 'contin' to 'continue' | 
					
						
							|  |  |  |         input = b"co\t\tntin\t\n" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         output = run_pty(script, input) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         self.assertIn(b'commands', output) | 
					
						
							|  |  |  |         self.assertIn(b'condition', output) | 
					
						
							|  |  |  |         self.assertIn(b'continue', output) | 
					
						
							|  |  |  |         self.assertIn(b'hello!', output) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-11-14 04:22:25 -08:00
										 |  |  |     def test_expression_completion(self): | 
					
						
							|  |  |  |         script = textwrap.dedent("""
 | 
					
						
							|  |  |  |             value = "speci" | 
					
						
							|  |  |  |             import pdb; pdb.Pdb().set_trace() | 
					
						
							|  |  |  |         """)
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         # Complete: value + 'al' | 
					
						
							|  |  |  |         input = b"val\t + 'al'\n" | 
					
						
							|  |  |  |         # Complete: p value + 'es' | 
					
						
							|  |  |  |         input += b"p val\t + 'es'\n" | 
					
						
							|  |  |  |         # Complete: $_frame | 
					
						
							|  |  |  |         input += b"$_fra\t\n" | 
					
						
							|  |  |  |         # Continue | 
					
						
							|  |  |  |         input += b"c\n" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         output = run_pty(script, input) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         self.assertIn(b'special', output) | 
					
						
							|  |  |  |         self.assertIn(b'species', output) | 
					
						
							|  |  |  |         self.assertIn(b'$_frame', output) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-03-25 08:18:09 -07:00
										 |  |  |     def test_builtin_completion(self): | 
					
						
							|  |  |  |         script = textwrap.dedent("""
 | 
					
						
							|  |  |  |             value = "speci" | 
					
						
							|  |  |  |             import pdb; pdb.Pdb().set_trace() | 
					
						
							|  |  |  |         """)
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         # Complete: print(value + 'al') | 
					
						
							|  |  |  |         input = b"pri\tval\t + 'al')\n" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         # Continue | 
					
						
							|  |  |  |         input += b"c\n" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         output = run_pty(script, input) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         self.assertIn(b'special', output) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def test_local_namespace(self): | 
					
						
							|  |  |  |         script = textwrap.dedent("""
 | 
					
						
							|  |  |  |             def f(): | 
					
						
							|  |  |  |                 original = "I live Pythin" | 
					
						
							|  |  |  |                 import pdb; pdb.Pdb().set_trace() | 
					
						
							|  |  |  |             f() | 
					
						
							|  |  |  |         """)
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         # Complete: original.replace('i', 'o') | 
					
						
							|  |  |  |         input = b"orig\t.repl\t('i', 'o')\n" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         # Continue | 
					
						
							|  |  |  |         input += b"c\n" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         output = run_pty(script, input) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         self.assertIn(b'I love Python', output) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def test_multiline_completion(self): | 
					
						
							|  |  |  |         script = textwrap.dedent("""
 | 
					
						
							|  |  |  |             import pdb; pdb.Pdb().set_trace() | 
					
						
							|  |  |  |         """)
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         input = b"def func():\n" | 
					
						
							|  |  |  |         # Complete: \treturn 40 + 2 | 
					
						
							|  |  |  |         input += b"\tret\t 40 + 2\n" | 
					
						
							|  |  |  |         input += b"\n" | 
					
						
							|  |  |  |         # Complete: func() | 
					
						
							|  |  |  |         input += b"fun\t()\n" | 
					
						
							|  |  |  |         input += b"c\n" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         output = run_pty(script, input) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         self.assertIn(b'42', output) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-11-13 02:23:06 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-09-13 10:49:53 +03:00
										 |  |  | def load_tests(loader, tests, pattern): | 
					
						
							| 
									
										
										
										
											2009-05-05 09:00:19 +00:00
										 |  |  |     from test import test_pdb | 
					
						
							| 
									
										
										
										
											2021-09-13 10:49:53 +03:00
										 |  |  |     tests.addTest(doctest.DocTestSuite(test_pdb)) | 
					
						
							|  |  |  |     return tests | 
					
						
							| 
									
										
										
										
											2009-05-05 09:00:19 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | if __name__ == '__main__': | 
					
						
							| 
									
										
										
										
											2013-03-18 10:09:50 -07:00
										 |  |  |     unittest.main() |