| Georg Brandl | 46b9afc | 2010-07-30 09:14:20 +0000 | [diff] [blame] | 1 | # A test suite for pdb; not very comprehensive at the moment. | 
| Martin v. Löwis | 67880cc | 2012-05-02 07:41:22 +0200 | [diff] [blame] | 2 |  | 
| Andrew Svetlov | f0efea0 | 2013-03-18 10:09:50 -0700 | [diff] [blame] | 3 | import doctest | 
| Łukasz Langa | 2eb6eca | 2016-09-09 22:21:17 -0700 | [diff] [blame] | 4 | import os | 
| Georg Brandl | 6cccb86 | 2010-07-30 14:16:43 +0000 | [diff] [blame] | 5 | import pdb | 
| Georg Brandl | 243ad66 | 2009-05-05 09:00:19 +0000 | [diff] [blame] | 6 | import sys | 
| Brett Cannon | 9529fbf | 2013-06-15 17:11:25 -0400 | [diff] [blame] | 7 | import types | 
| Georg Brandl | 6cccb86 | 2010-07-30 14:16:43 +0000 | [diff] [blame] | 8 | import unittest | 
 | 9 | import subprocess | 
| Senthil Kumaran | 42d7081 | 2012-05-01 10:07:49 +0800 | [diff] [blame] | 10 | import textwrap | 
| Georg Brandl | 243ad66 | 2009-05-05 09:00:19 +0000 | [diff] [blame] | 11 |  | 
| Barry Warsaw | 35425d6 | 2017-09-22 12:29:42 -0400 | [diff] [blame] | 12 | from contextlib import ExitStack | 
 | 13 | from io import StringIO | 
| Georg Brandl | 243ad66 | 2009-05-05 09:00:19 +0000 | [diff] [blame] | 14 | from test import support | 
 | 15 | # This little helper class is essential for testing pdb under doctest. | 
 | 16 | from test.test_doctest import _FakeInput | 
| Barry Warsaw | 35425d6 | 2017-09-22 12:29:42 -0400 | [diff] [blame] | 17 | from unittest.mock import patch | 
| Georg Brandl | 243ad66 | 2009-05-05 09:00:19 +0000 | [diff] [blame] | 18 |  | 
 | 19 |  | 
| Georg Brandl | 9fa2e02 | 2009-09-16 16:40:45 +0000 | [diff] [blame] | 20 | class PdbTestInput(object): | 
 | 21 |     """Context manager that makes testing Pdb in doctests easier.""" | 
 | 22 |  | 
 | 23 |     def __init__(self, input): | 
 | 24 |         self.input = input | 
 | 25 |  | 
 | 26 |     def __enter__(self): | 
 | 27 |         self.real_stdin = sys.stdin | 
 | 28 |         sys.stdin = _FakeInput(self.input) | 
| Brett Cannon | 31f5929 | 2011-02-21 19:29:56 +0000 | [diff] [blame] | 29 |         self.orig_trace = sys.gettrace() if hasattr(sys, 'gettrace') else None | 
| Georg Brandl | 9fa2e02 | 2009-09-16 16:40:45 +0000 | [diff] [blame] | 30 |  | 
 | 31 |     def __exit__(self, *exc): | 
 | 32 |         sys.stdin = self.real_stdin | 
| Brett Cannon | 31f5929 | 2011-02-21 19:29:56 +0000 | [diff] [blame] | 33 |         if self.orig_trace: | 
 | 34 |             sys.settrace(self.orig_trace) | 
| Georg Brandl | 9fa2e02 | 2009-09-16 16:40:45 +0000 | [diff] [blame] | 35 |  | 
 | 36 |  | 
 | 37 | def test_pdb_displayhook(): | 
 | 38 |     """This tests the custom displayhook for pdb. | 
 | 39 |  | 
 | 40 |     >>> def test_function(foo, bar): | 
| Łukasz Langa | 2eb6eca | 2016-09-09 22:21:17 -0700 | [diff] [blame] | 41 |     ...     import pdb; pdb.Pdb(nosigint=True, readrc=False).set_trace() | 
| Georg Brandl | 9fa2e02 | 2009-09-16 16:40:45 +0000 | [diff] [blame] | 42 |     ...     pass | 
 | 43 |  | 
 | 44 |     >>> with PdbTestInput([ | 
 | 45 |     ...     'foo', | 
 | 46 |     ...     'bar', | 
 | 47 |     ...     'for i in range(5): print(i)', | 
 | 48 |     ...     'continue', | 
 | 49 |     ... ]): | 
 | 50 |     ...     test_function(1, None) | 
 | 51 |     > <doctest test.test_pdb.test_pdb_displayhook[0]>(3)test_function() | 
 | 52 |     -> pass | 
 | 53 |     (Pdb) foo | 
 | 54 |     1 | 
 | 55 |     (Pdb) bar | 
 | 56 |     (Pdb) for i in range(5): print(i) | 
 | 57 |     0 | 
 | 58 |     1 | 
 | 59 |     2 | 
 | 60 |     3 | 
 | 61 |     4 | 
 | 62 |     (Pdb) continue | 
 | 63 |     """ | 
 | 64 |  | 
 | 65 |  | 
| Georg Brandl | 0d08962 | 2010-07-30 16:00:46 +0000 | [diff] [blame] | 66 | def test_pdb_basic_commands(): | 
 | 67 |     """Test the basic commands of pdb. | 
 | 68 |  | 
 | 69 |     >>> def test_function_2(foo, bar='default'): | 
 | 70 |     ...     print(foo) | 
 | 71 |     ...     for i in range(5): | 
 | 72 |     ...         print(i) | 
 | 73 |     ...     print(bar) | 
 | 74 |     ...     for i in range(10): | 
 | 75 |     ...         never_executed | 
 | 76 |     ...     print('after for') | 
 | 77 |     ...     print('...') | 
 | 78 |     ...     return foo.upper() | 
 | 79 |  | 
 | 80 |     >>> def test_function(): | 
| Łukasz Langa | 2eb6eca | 2016-09-09 22:21:17 -0700 | [diff] [blame] | 81 |     ...     import pdb; pdb.Pdb(nosigint=True, readrc=False).set_trace() | 
| Georg Brandl | 0d08962 | 2010-07-30 16:00:46 +0000 | [diff] [blame] | 82 |     ...     ret = test_function_2('baz') | 
 | 83 |     ...     print(ret) | 
 | 84 |  | 
 | 85 |     >>> with PdbTestInput([  # doctest: +ELLIPSIS, +NORMALIZE_WHITESPACE | 
 | 86 |     ...     'step',       # entering the function call | 
 | 87 |     ...     'args',       # display function args | 
 | 88 |     ...     'list',       # list function source | 
 | 89 |     ...     'bt',         # display backtrace | 
 | 90 |     ...     'up',         # step up to test_function() | 
 | 91 |     ...     'down',       # step down to test_function_2() again | 
 | 92 |     ...     'next',       # stepping to print(foo) | 
 | 93 |     ...     'next',       # stepping to the for loop | 
 | 94 |     ...     'step',       # stepping into the for loop | 
 | 95 |     ...     'until',      # continuing until out of the for loop | 
 | 96 |     ...     'next',       # executing the print(bar) | 
 | 97 |     ...     'jump 8',     # jump over second for loop | 
 | 98 |     ...     'return',     # return out of function | 
 | 99 |     ...     'retval',     # display return value | 
 | 100 |     ...     'continue', | 
 | 101 |     ... ]): | 
 | 102 |     ...    test_function() | 
 | 103 |     > <doctest test.test_pdb.test_pdb_basic_commands[1]>(3)test_function() | 
 | 104 |     -> ret = test_function_2('baz') | 
 | 105 |     (Pdb) step | 
 | 106 |     --Call-- | 
 | 107 |     > <doctest test.test_pdb.test_pdb_basic_commands[0]>(1)test_function_2() | 
 | 108 |     -> def test_function_2(foo, bar='default'): | 
 | 109 |     (Pdb) args | 
 | 110 |     foo = 'baz' | 
 | 111 |     bar = 'default' | 
 | 112 |     (Pdb) list | 
 | 113 |       1  ->     def test_function_2(foo, bar='default'): | 
 | 114 |       2             print(foo) | 
 | 115 |       3             for i in range(5): | 
 | 116 |       4                 print(i) | 
 | 117 |       5             print(bar) | 
 | 118 |       6             for i in range(10): | 
 | 119 |       7                 never_executed | 
 | 120 |       8             print('after for') | 
 | 121 |       9             print('...') | 
 | 122 |      10             return foo.upper() | 
 | 123 |     [EOF] | 
 | 124 |     (Pdb) bt | 
 | 125 |     ... | 
 | 126 |       <doctest test.test_pdb.test_pdb_basic_commands[2]>(18)<module>() | 
 | 127 |     -> test_function() | 
 | 128 |       <doctest test.test_pdb.test_pdb_basic_commands[1]>(3)test_function() | 
 | 129 |     -> ret = test_function_2('baz') | 
 | 130 |     > <doctest test.test_pdb.test_pdb_basic_commands[0]>(1)test_function_2() | 
 | 131 |     -> def test_function_2(foo, bar='default'): | 
 | 132 |     (Pdb) up | 
 | 133 |     > <doctest test.test_pdb.test_pdb_basic_commands[1]>(3)test_function() | 
 | 134 |     -> ret = test_function_2('baz') | 
 | 135 |     (Pdb) down | 
 | 136 |     > <doctest test.test_pdb.test_pdb_basic_commands[0]>(1)test_function_2() | 
 | 137 |     -> def test_function_2(foo, bar='default'): | 
 | 138 |     (Pdb) next | 
 | 139 |     > <doctest test.test_pdb.test_pdb_basic_commands[0]>(2)test_function_2() | 
 | 140 |     -> print(foo) | 
 | 141 |     (Pdb) next | 
 | 142 |     baz | 
 | 143 |     > <doctest test.test_pdb.test_pdb_basic_commands[0]>(3)test_function_2() | 
 | 144 |     -> for i in range(5): | 
 | 145 |     (Pdb) step | 
 | 146 |     > <doctest test.test_pdb.test_pdb_basic_commands[0]>(4)test_function_2() | 
 | 147 |     -> print(i) | 
 | 148 |     (Pdb) until | 
 | 149 |     0 | 
 | 150 |     1 | 
 | 151 |     2 | 
 | 152 |     3 | 
 | 153 |     4 | 
 | 154 |     > <doctest test.test_pdb.test_pdb_basic_commands[0]>(5)test_function_2() | 
 | 155 |     -> print(bar) | 
 | 156 |     (Pdb) next | 
 | 157 |     default | 
 | 158 |     > <doctest test.test_pdb.test_pdb_basic_commands[0]>(6)test_function_2() | 
 | 159 |     -> for i in range(10): | 
 | 160 |     (Pdb) jump 8 | 
 | 161 |     > <doctest test.test_pdb.test_pdb_basic_commands[0]>(8)test_function_2() | 
 | 162 |     -> print('after for') | 
 | 163 |     (Pdb) return | 
 | 164 |     after for | 
 | 165 |     ... | 
 | 166 |     --Return-- | 
 | 167 |     > <doctest test.test_pdb.test_pdb_basic_commands[0]>(10)test_function_2()->'BAZ' | 
 | 168 |     -> return foo.upper() | 
 | 169 |     (Pdb) retval | 
 | 170 |     'BAZ' | 
 | 171 |     (Pdb) continue | 
 | 172 |     BAZ | 
 | 173 |     """ | 
 | 174 |  | 
 | 175 |  | 
 | 176 | def test_pdb_breakpoint_commands(): | 
 | 177 |     """Test basic commands related to breakpoints. | 
 | 178 |  | 
 | 179 |     >>> def test_function(): | 
| Łukasz Langa | 2eb6eca | 2016-09-09 22:21:17 -0700 | [diff] [blame] | 180 |     ...     import pdb; pdb.Pdb(nosigint=True, readrc=False).set_trace() | 
| Georg Brandl | 0d08962 | 2010-07-30 16:00:46 +0000 | [diff] [blame] | 181 |     ...     print(1) | 
 | 182 |     ...     print(2) | 
 | 183 |     ...     print(3) | 
 | 184 |     ...     print(4) | 
 | 185 |  | 
 | 186 |     First, need to clear bdb state that might be left over from previous tests. | 
 | 187 |     Otherwise, the new breakpoints might get assigned different numbers. | 
 | 188 |  | 
 | 189 |     >>> from bdb import Breakpoint | 
 | 190 |     >>> Breakpoint.next = 1 | 
 | 191 |     >>> Breakpoint.bplist = {} | 
 | 192 |     >>> Breakpoint.bpbynumber = [None] | 
 | 193 |  | 
 | 194 |     Now test the breakpoint commands.  NORMALIZE_WHITESPACE is needed because | 
 | 195 |     the breakpoint list outputs a tab for the "stop only" and "ignore next" | 
 | 196 |     lines, which we don't want to put in here. | 
 | 197 |  | 
 | 198 |     >>> with PdbTestInput([  # doctest: +NORMALIZE_WHITESPACE | 
 | 199 |     ...     'break 3', | 
 | 200 |     ...     'disable 1', | 
 | 201 |     ...     'ignore 1 10', | 
 | 202 |     ...     'condition 1 1 < 2', | 
 | 203 |     ...     'break 4', | 
| Senthil Kumaran | 6f10704 | 2010-11-29 11:54:17 +0000 | [diff] [blame] | 204 |     ...     'break 4', | 
 | 205 |     ...     'break', | 
 | 206 |     ...     'clear 3', | 
| Georg Brandl | 0d08962 | 2010-07-30 16:00:46 +0000 | [diff] [blame] | 207 |     ...     'break', | 
 | 208 |     ...     'condition 1', | 
 | 209 |     ...     'enable 1', | 
 | 210 |     ...     'clear 1', | 
 | 211 |     ...     'commands 2', | 
| R David Murray | 78d692f | 2013-10-10 17:23:26 -0400 | [diff] [blame] | 212 |     ...     'p "42"', | 
 | 213 |     ...     'print("42", 7*6)',     # Issue 18764 (not about breakpoints) | 
| Georg Brandl | 0d08962 | 2010-07-30 16:00:46 +0000 | [diff] [blame] | 214 |     ...     'end', | 
 | 215 |     ...     'continue',  # will stop at breakpoint 2 (line 4) | 
 | 216 |     ...     'clear',     # clear all! | 
 | 217 |     ...     'y', | 
 | 218 |     ...     'tbreak 5', | 
 | 219 |     ...     'continue',  # will stop at temporary breakpoint | 
 | 220 |     ...     'break',     # make sure breakpoint is gone | 
 | 221 |     ...     'continue', | 
 | 222 |     ... ]): | 
 | 223 |     ...    test_function() | 
 | 224 |     > <doctest test.test_pdb.test_pdb_breakpoint_commands[0]>(3)test_function() | 
 | 225 |     -> print(1) | 
 | 226 |     (Pdb) break 3 | 
 | 227 |     Breakpoint 1 at <doctest test.test_pdb.test_pdb_breakpoint_commands[0]>:3 | 
 | 228 |     (Pdb) disable 1 | 
 | 229 |     Disabled breakpoint 1 at <doctest test.test_pdb.test_pdb_breakpoint_commands[0]>:3 | 
 | 230 |     (Pdb) ignore 1 10 | 
 | 231 |     Will ignore next 10 crossings of breakpoint 1. | 
 | 232 |     (Pdb) condition 1 1 < 2 | 
 | 233 |     New condition set for breakpoint 1. | 
 | 234 |     (Pdb) break 4 | 
 | 235 |     Breakpoint 2 at <doctest test.test_pdb.test_pdb_breakpoint_commands[0]>:4 | 
| Senthil Kumaran | 6f10704 | 2010-11-29 11:54:17 +0000 | [diff] [blame] | 236 |     (Pdb) break 4 | 
 | 237 |     Breakpoint 3 at <doctest test.test_pdb.test_pdb_breakpoint_commands[0]>:4 | 
 | 238 |     (Pdb) break | 
 | 239 |     Num Type         Disp Enb   Where | 
 | 240 |     1   breakpoint   keep no    at <doctest test.test_pdb.test_pdb_breakpoint_commands[0]>:3 | 
 | 241 |             stop only if 1 < 2 | 
 | 242 |             ignore next 10 hits | 
 | 243 |     2   breakpoint   keep yes   at <doctest test.test_pdb.test_pdb_breakpoint_commands[0]>:4 | 
 | 244 |     3   breakpoint   keep yes   at <doctest test.test_pdb.test_pdb_breakpoint_commands[0]>:4 | 
 | 245 |     (Pdb) clear 3 | 
 | 246 |     Deleted breakpoint 3 at <doctest test.test_pdb.test_pdb_breakpoint_commands[0]>:4 | 
| Georg Brandl | 0d08962 | 2010-07-30 16:00:46 +0000 | [diff] [blame] | 247 |     (Pdb) break | 
 | 248 |     Num Type         Disp Enb   Where | 
 | 249 |     1   breakpoint   keep no    at <doctest test.test_pdb.test_pdb_breakpoint_commands[0]>:3 | 
 | 250 |             stop only if 1 < 2 | 
 | 251 |             ignore next 10 hits | 
 | 252 |     2   breakpoint   keep yes   at <doctest test.test_pdb.test_pdb_breakpoint_commands[0]>:4 | 
 | 253 |     (Pdb) condition 1 | 
 | 254 |     Breakpoint 1 is now unconditional. | 
 | 255 |     (Pdb) enable 1 | 
 | 256 |     Enabled breakpoint 1 at <doctest test.test_pdb.test_pdb_breakpoint_commands[0]>:3 | 
 | 257 |     (Pdb) clear 1 | 
 | 258 |     Deleted breakpoint 1 at <doctest test.test_pdb.test_pdb_breakpoint_commands[0]>:3 | 
 | 259 |     (Pdb) commands 2 | 
| R David Murray | 78d692f | 2013-10-10 17:23:26 -0400 | [diff] [blame] | 260 |     (com) p "42" | 
 | 261 |     (com) print("42", 7*6) | 
| Georg Brandl | 0d08962 | 2010-07-30 16:00:46 +0000 | [diff] [blame] | 262 |     (com) end | 
 | 263 |     (Pdb) continue | 
 | 264 |     1 | 
| R David Murray | 78d692f | 2013-10-10 17:23:26 -0400 | [diff] [blame] | 265 |     '42' | 
 | 266 |     42 42 | 
| Georg Brandl | 0d08962 | 2010-07-30 16:00:46 +0000 | [diff] [blame] | 267 |     > <doctest test.test_pdb.test_pdb_breakpoint_commands[0]>(4)test_function() | 
 | 268 |     -> print(2) | 
 | 269 |     (Pdb) clear | 
 | 270 |     Clear all breaks? y | 
 | 271 |     Deleted breakpoint 2 at <doctest test.test_pdb.test_pdb_breakpoint_commands[0]>:4 | 
 | 272 |     (Pdb) tbreak 5 | 
| Senthil Kumaran | 6f10704 | 2010-11-29 11:54:17 +0000 | [diff] [blame] | 273 |     Breakpoint 4 at <doctest test.test_pdb.test_pdb_breakpoint_commands[0]>:5 | 
| Georg Brandl | 0d08962 | 2010-07-30 16:00:46 +0000 | [diff] [blame] | 274 |     (Pdb) continue | 
 | 275 |     2 | 
| Senthil Kumaran | 6f10704 | 2010-11-29 11:54:17 +0000 | [diff] [blame] | 276 |     Deleted breakpoint 4 at <doctest test.test_pdb.test_pdb_breakpoint_commands[0]>:5 | 
| Georg Brandl | 0d08962 | 2010-07-30 16:00:46 +0000 | [diff] [blame] | 277 |     > <doctest test.test_pdb.test_pdb_breakpoint_commands[0]>(5)test_function() | 
 | 278 |     -> print(3) | 
 | 279 |     (Pdb) break | 
 | 280 |     (Pdb) continue | 
 | 281 |     3 | 
 | 282 |     4 | 
 | 283 |     """ | 
 | 284 |  | 
 | 285 |  | 
| Georg Brandl | e59ca2a | 2010-07-30 17:04:28 +0000 | [diff] [blame] | 286 | def do_nothing(): | 
 | 287 |     pass | 
 | 288 |  | 
 | 289 | def do_something(): | 
 | 290 |     print(42) | 
 | 291 |  | 
 | 292 | def test_list_commands(): | 
 | 293 |     """Test the list and source commands of pdb. | 
 | 294 |  | 
 | 295 |     >>> def test_function_2(foo): | 
| Georg Brandl | a8fbc6a | 2010-07-31 11:52:46 +0000 | [diff] [blame] | 296 |     ...     import test.test_pdb | 
 | 297 |     ...     test.test_pdb.do_nothing() | 
| Georg Brandl | e59ca2a | 2010-07-30 17:04:28 +0000 | [diff] [blame] | 298 |     ...     'some...' | 
 | 299 |     ...     'more...' | 
 | 300 |     ...     'code...' | 
 | 301 |     ...     'to...' | 
 | 302 |     ...     'make...' | 
 | 303 |     ...     'a...' | 
 | 304 |     ...     'long...' | 
 | 305 |     ...     'listing...' | 
 | 306 |     ...     'useful...' | 
 | 307 |     ...     '...' | 
 | 308 |     ...     '...' | 
 | 309 |     ...     return foo | 
 | 310 |  | 
 | 311 |     >>> def test_function(): | 
| Łukasz Langa | 2eb6eca | 2016-09-09 22:21:17 -0700 | [diff] [blame] | 312 |     ...     import pdb; pdb.Pdb(nosigint=True, readrc=False).set_trace() | 
| Georg Brandl | e59ca2a | 2010-07-30 17:04:28 +0000 | [diff] [blame] | 313 |     ...     ret = test_function_2('baz') | 
 | 314 |  | 
 | 315 |     >>> with PdbTestInput([  # doctest: +ELLIPSIS, +NORMALIZE_WHITESPACE | 
 | 316 |     ...     'list',      # list first function | 
 | 317 |     ...     'step',      # step into second function | 
 | 318 |     ...     'list',      # list second function | 
 | 319 |     ...     'list',      # continue listing to EOF | 
 | 320 |     ...     'list 1,3',  # list specific lines | 
 | 321 |     ...     'list x',    # invalid argument | 
 | 322 |     ...     'next',      # step to import | 
 | 323 |     ...     'next',      # step over import | 
 | 324 |     ...     'step',      # step into do_nothing | 
 | 325 |     ...     'longlist',  # list all lines | 
 | 326 |     ...     'source do_something',  # list all lines of function | 
| Georg Brandl | cdf66a9 | 2010-07-30 18:15:16 +0000 | [diff] [blame] | 327 |     ...     'source fooxxx',        # something that doesn't exit | 
| Georg Brandl | e59ca2a | 2010-07-30 17:04:28 +0000 | [diff] [blame] | 328 |     ...     'continue', | 
 | 329 |     ... ]): | 
 | 330 |     ...    test_function() | 
 | 331 |     > <doctest test.test_pdb.test_list_commands[1]>(3)test_function() | 
 | 332 |     -> ret = test_function_2('baz') | 
 | 333 |     (Pdb) list | 
 | 334 |       1         def test_function(): | 
| Łukasz Langa | 2eb6eca | 2016-09-09 22:21:17 -0700 | [diff] [blame] | 335 |       2             import pdb; pdb.Pdb(nosigint=True, readrc=False).set_trace() | 
| Georg Brandl | e59ca2a | 2010-07-30 17:04:28 +0000 | [diff] [blame] | 336 |       3  ->         ret = test_function_2('baz') | 
 | 337 |     [EOF] | 
 | 338 |     (Pdb) step | 
 | 339 |     --Call-- | 
 | 340 |     > <doctest test.test_pdb.test_list_commands[0]>(1)test_function_2() | 
 | 341 |     -> def test_function_2(foo): | 
 | 342 |     (Pdb) list | 
 | 343 |       1  ->     def test_function_2(foo): | 
| Georg Brandl | a8fbc6a | 2010-07-31 11:52:46 +0000 | [diff] [blame] | 344 |       2             import test.test_pdb | 
 | 345 |       3             test.test_pdb.do_nothing() | 
| Georg Brandl | e59ca2a | 2010-07-30 17:04:28 +0000 | [diff] [blame] | 346 |       4             'some...' | 
 | 347 |       5             'more...' | 
 | 348 |       6             'code...' | 
 | 349 |       7             'to...' | 
 | 350 |       8             'make...' | 
 | 351 |       9             'a...' | 
 | 352 |      10             'long...' | 
 | 353 |      11             'listing...' | 
 | 354 |     (Pdb) list | 
 | 355 |      12             'useful...' | 
 | 356 |      13             '...' | 
 | 357 |      14             '...' | 
 | 358 |      15             return foo | 
 | 359 |     [EOF] | 
 | 360 |     (Pdb) list 1,3 | 
 | 361 |       1  ->     def test_function_2(foo): | 
| Georg Brandl | a8fbc6a | 2010-07-31 11:52:46 +0000 | [diff] [blame] | 362 |       2             import test.test_pdb | 
 | 363 |       3             test.test_pdb.do_nothing() | 
| Georg Brandl | e59ca2a | 2010-07-30 17:04:28 +0000 | [diff] [blame] | 364 |     (Pdb) list x | 
 | 365 |     *** ... | 
 | 366 |     (Pdb) next | 
 | 367 |     > <doctest test.test_pdb.test_list_commands[0]>(2)test_function_2() | 
| Georg Brandl | a8fbc6a | 2010-07-31 11:52:46 +0000 | [diff] [blame] | 368 |     -> import test.test_pdb | 
| Georg Brandl | e59ca2a | 2010-07-30 17:04:28 +0000 | [diff] [blame] | 369 |     (Pdb) next | 
 | 370 |     > <doctest test.test_pdb.test_list_commands[0]>(3)test_function_2() | 
| Georg Brandl | a8fbc6a | 2010-07-31 11:52:46 +0000 | [diff] [blame] | 371 |     -> test.test_pdb.do_nothing() | 
| Georg Brandl | e59ca2a | 2010-07-30 17:04:28 +0000 | [diff] [blame] | 372 |     (Pdb) step | 
 | 373 |     --Call-- | 
| Georg Brandl | e1e8df1 | 2010-07-31 08:14:16 +0000 | [diff] [blame] | 374 |     > ...test_pdb.py(...)do_nothing() | 
| Georg Brandl | e59ca2a | 2010-07-30 17:04:28 +0000 | [diff] [blame] | 375 |     -> def do_nothing(): | 
 | 376 |     (Pdb) longlist | 
 | 377 |     ...  ->     def do_nothing(): | 
 | 378 |     ...             pass | 
 | 379 |     (Pdb) source do_something | 
 | 380 |     ...         def do_something(): | 
 | 381 |     ...             print(42) | 
| Georg Brandl | cdf66a9 | 2010-07-30 18:15:16 +0000 | [diff] [blame] | 382 |     (Pdb) source fooxxx | 
 | 383 |     *** ... | 
| Georg Brandl | e59ca2a | 2010-07-30 17:04:28 +0000 | [diff] [blame] | 384 |     (Pdb) continue | 
 | 385 |     """ | 
 | 386 |  | 
 | 387 |  | 
| Georg Brandl | 0a9c3e9 | 2010-07-30 18:46:38 +0000 | [diff] [blame] | 388 | def test_post_mortem(): | 
 | 389 |     """Test post mortem traceback debugging. | 
 | 390 |  | 
 | 391 |     >>> def test_function_2(): | 
 | 392 |     ...     try: | 
 | 393 |     ...         1/0 | 
 | 394 |     ...     finally: | 
 | 395 |     ...         print('Exception!') | 
 | 396 |  | 
 | 397 |     >>> def test_function(): | 
| Łukasz Langa | 2eb6eca | 2016-09-09 22:21:17 -0700 | [diff] [blame] | 398 |     ...     import pdb; pdb.Pdb(nosigint=True, readrc=False).set_trace() | 
| Georg Brandl | 0a9c3e9 | 2010-07-30 18:46:38 +0000 | [diff] [blame] | 399 |     ...     test_function_2() | 
 | 400 |     ...     print('Not reached.') | 
 | 401 |  | 
 | 402 |     >>> with PdbTestInput([  # doctest: +ELLIPSIS, +NORMALIZE_WHITESPACE | 
 | 403 |     ...     'next',      # step over exception-raising call | 
 | 404 |     ...     'bt',        # get a backtrace | 
 | 405 |     ...     'list',      # list code of test_function() | 
 | 406 |     ...     'down',      # step into test_function_2() | 
 | 407 |     ...     'list',      # list code of test_function_2() | 
 | 408 |     ...     'continue', | 
 | 409 |     ... ]): | 
 | 410 |     ...    try: | 
 | 411 |     ...        test_function() | 
 | 412 |     ...    except ZeroDivisionError: | 
 | 413 |     ...        print('Correctly reraised.') | 
 | 414 |     > <doctest test.test_pdb.test_post_mortem[1]>(3)test_function() | 
 | 415 |     -> test_function_2() | 
 | 416 |     (Pdb) next | 
 | 417 |     Exception! | 
 | 418 |     ZeroDivisionError: division by zero | 
 | 419 |     > <doctest test.test_pdb.test_post_mortem[1]>(3)test_function() | 
 | 420 |     -> test_function_2() | 
 | 421 |     (Pdb) bt | 
 | 422 |     ... | 
 | 423 |       <doctest test.test_pdb.test_post_mortem[2]>(10)<module>() | 
 | 424 |     -> test_function() | 
 | 425 |     > <doctest test.test_pdb.test_post_mortem[1]>(3)test_function() | 
 | 426 |     -> test_function_2() | 
 | 427 |       <doctest test.test_pdb.test_post_mortem[0]>(3)test_function_2() | 
 | 428 |     -> 1/0 | 
 | 429 |     (Pdb) list | 
 | 430 |       1         def test_function(): | 
| Łukasz Langa | 2eb6eca | 2016-09-09 22:21:17 -0700 | [diff] [blame] | 431 |       2             import pdb; pdb.Pdb(nosigint=True, readrc=False).set_trace() | 
| Georg Brandl | 0a9c3e9 | 2010-07-30 18:46:38 +0000 | [diff] [blame] | 432 |       3  ->         test_function_2() | 
 | 433 |       4             print('Not reached.') | 
 | 434 |     [EOF] | 
 | 435 |     (Pdb) down | 
 | 436 |     > <doctest test.test_pdb.test_post_mortem[0]>(3)test_function_2() | 
 | 437 |     -> 1/0 | 
 | 438 |     (Pdb) list | 
 | 439 |       1         def test_function_2(): | 
 | 440 |       2             try: | 
 | 441 |       3  >>             1/0 | 
 | 442 |       4             finally: | 
 | 443 |       5  ->             print('Exception!') | 
 | 444 |     [EOF] | 
 | 445 |     (Pdb) continue | 
 | 446 |     Correctly reraised. | 
 | 447 |     """ | 
 | 448 |  | 
 | 449 |  | 
| Georg Brandl | 243ad66 | 2009-05-05 09:00:19 +0000 | [diff] [blame] | 450 | def test_pdb_skip_modules(): | 
 | 451 |     """This illustrates the simple case of module skipping. | 
 | 452 |  | 
 | 453 |     >>> def skip_module(): | 
 | 454 |     ...     import string | 
| Łukasz Langa | 2eb6eca | 2016-09-09 22:21:17 -0700 | [diff] [blame] | 455 |     ...     import pdb; pdb.Pdb(skip=['stri*'], nosigint=True, readrc=False).set_trace() | 
| Georg Brandl | 243ad66 | 2009-05-05 09:00:19 +0000 | [diff] [blame] | 456 |     ...     string.capwords('FOO') | 
| Georg Brandl | 243ad66 | 2009-05-05 09:00:19 +0000 | [diff] [blame] | 457 |  | 
| Georg Brandl | 9fa2e02 | 2009-09-16 16:40:45 +0000 | [diff] [blame] | 458 |     >>> with PdbTestInput([ | 
 | 459 |     ...     'step', | 
 | 460 |     ...     'continue', | 
 | 461 |     ... ]): | 
| Georg Brandl | 243ad66 | 2009-05-05 09:00:19 +0000 | [diff] [blame] | 462 |     ...     skip_module() | 
| Georg Brandl | 243ad66 | 2009-05-05 09:00:19 +0000 | [diff] [blame] | 463 |     > <doctest test.test_pdb.test_pdb_skip_modules[0]>(4)skip_module() | 
 | 464 |     -> string.capwords('FOO') | 
 | 465 |     (Pdb) step | 
 | 466 |     --Return-- | 
 | 467 |     > <doctest test.test_pdb.test_pdb_skip_modules[0]>(4)skip_module()->None | 
 | 468 |     -> string.capwords('FOO') | 
 | 469 |     (Pdb) continue | 
| Georg Brandl | 9fa2e02 | 2009-09-16 16:40:45 +0000 | [diff] [blame] | 470 |     """ | 
| Georg Brandl | 243ad66 | 2009-05-05 09:00:19 +0000 | [diff] [blame] | 471 |  | 
 | 472 |  | 
 | 473 | # Module for testing skipping of module that makes a callback | 
| Brett Cannon | 9529fbf | 2013-06-15 17:11:25 -0400 | [diff] [blame] | 474 | mod = types.ModuleType('module_to_skip') | 
| Georg Brandl | 243ad66 | 2009-05-05 09:00:19 +0000 | [diff] [blame] | 475 | exec('def foo_pony(callback): x = 1; callback(); return None', mod.__dict__) | 
 | 476 |  | 
 | 477 |  | 
 | 478 | def test_pdb_skip_modules_with_callback(): | 
 | 479 |     """This illustrates skipping of modules that call into other code. | 
 | 480 |  | 
 | 481 |     >>> def skip_module(): | 
 | 482 |     ...     def callback(): | 
 | 483 |     ...         return None | 
| Łukasz Langa | 2eb6eca | 2016-09-09 22:21:17 -0700 | [diff] [blame] | 484 |     ...     import pdb; pdb.Pdb(skip=['module_to_skip*'], nosigint=True, readrc=False).set_trace() | 
| Georg Brandl | 243ad66 | 2009-05-05 09:00:19 +0000 | [diff] [blame] | 485 |     ...     mod.foo_pony(callback) | 
| Georg Brandl | 243ad66 | 2009-05-05 09:00:19 +0000 | [diff] [blame] | 486 |  | 
| Georg Brandl | 9fa2e02 | 2009-09-16 16:40:45 +0000 | [diff] [blame] | 487 |     >>> with PdbTestInput([ | 
 | 488 |     ...     'step', | 
 | 489 |     ...     'step', | 
 | 490 |     ...     'step', | 
 | 491 |     ...     'step', | 
 | 492 |     ...     'step', | 
 | 493 |     ...     'continue', | 
 | 494 |     ... ]): | 
| Georg Brandl | 243ad66 | 2009-05-05 09:00:19 +0000 | [diff] [blame] | 495 |     ...     skip_module() | 
| Georg Brandl | 9fa2e02 | 2009-09-16 16:40:45 +0000 | [diff] [blame] | 496 |     ...     pass  # provides something to "step" to | 
| Georg Brandl | 243ad66 | 2009-05-05 09:00:19 +0000 | [diff] [blame] | 497 |     > <doctest test.test_pdb.test_pdb_skip_modules_with_callback[0]>(5)skip_module() | 
 | 498 |     -> mod.foo_pony(callback) | 
 | 499 |     (Pdb) step | 
 | 500 |     --Call-- | 
 | 501 |     > <doctest test.test_pdb.test_pdb_skip_modules_with_callback[0]>(2)callback() | 
 | 502 |     -> def callback(): | 
 | 503 |     (Pdb) step | 
 | 504 |     > <doctest test.test_pdb.test_pdb_skip_modules_with_callback[0]>(3)callback() | 
 | 505 |     -> return None | 
 | 506 |     (Pdb) step | 
 | 507 |     --Return-- | 
 | 508 |     > <doctest test.test_pdb.test_pdb_skip_modules_with_callback[0]>(3)callback()->None | 
 | 509 |     -> return None | 
 | 510 |     (Pdb) step | 
 | 511 |     --Return-- | 
 | 512 |     > <doctest test.test_pdb.test_pdb_skip_modules_with_callback[0]>(5)skip_module()->None | 
 | 513 |     -> mod.foo_pony(callback) | 
 | 514 |     (Pdb) step | 
| Georg Brandl | 9fa2e02 | 2009-09-16 16:40:45 +0000 | [diff] [blame] | 515 |     > <doctest test.test_pdb.test_pdb_skip_modules_with_callback[1]>(10)<module>() | 
 | 516 |     -> pass  # provides something to "step" to | 
| Georg Brandl | 243ad66 | 2009-05-05 09:00:19 +0000 | [diff] [blame] | 517 |     (Pdb) continue | 
| Georg Brandl | 9fa2e02 | 2009-09-16 16:40:45 +0000 | [diff] [blame] | 518 |     """ | 
| Georg Brandl | 243ad66 | 2009-05-05 09:00:19 +0000 | [diff] [blame] | 519 |  | 
 | 520 |  | 
| Georg Brandl | 3f94089 | 2010-07-30 10:29:19 +0000 | [diff] [blame] | 521 | def test_pdb_continue_in_bottomframe(): | 
 | 522 |     """Test that "continue" and "next" work properly in bottom frame (issue #5294). | 
 | 523 |  | 
 | 524 |     >>> def test_function(): | 
| Łukasz Langa | 2eb6eca | 2016-09-09 22:21:17 -0700 | [diff] [blame] | 525 |     ...     import pdb, sys; inst = pdb.Pdb(nosigint=True, readrc=False) | 
| Georg Brandl | 3f94089 | 2010-07-30 10:29:19 +0000 | [diff] [blame] | 526 |     ...     inst.set_trace() | 
 | 527 |     ...     inst.botframe = sys._getframe()  # hackery to get the right botframe | 
 | 528 |     ...     print(1) | 
 | 529 |     ...     print(2) | 
 | 530 |     ...     print(3) | 
 | 531 |     ...     print(4) | 
 | 532 |  | 
| Georg Brandl | 7410dd1 | 2010-07-30 12:01:20 +0000 | [diff] [blame] | 533 |     >>> with PdbTestInput([  # doctest: +ELLIPSIS | 
| Georg Brandl | 3f94089 | 2010-07-30 10:29:19 +0000 | [diff] [blame] | 534 |     ...     'next', | 
 | 535 |     ...     'break 7', | 
 | 536 |     ...     'continue', | 
 | 537 |     ...     'next', | 
 | 538 |     ...     'continue', | 
 | 539 |     ...     'continue', | 
 | 540 |     ... ]): | 
 | 541 |     ...    test_function() | 
 | 542 |     > <doctest test.test_pdb.test_pdb_continue_in_bottomframe[0]>(4)test_function() | 
 | 543 |     -> inst.botframe = sys._getframe()  # hackery to get the right botframe | 
 | 544 |     (Pdb) next | 
 | 545 |     > <doctest test.test_pdb.test_pdb_continue_in_bottomframe[0]>(5)test_function() | 
 | 546 |     -> print(1) | 
 | 547 |     (Pdb) break 7 | 
| Georg Brandl | 7410dd1 | 2010-07-30 12:01:20 +0000 | [diff] [blame] | 548 |     Breakpoint ... at <doctest test.test_pdb.test_pdb_continue_in_bottomframe[0]>:7 | 
| Georg Brandl | 3f94089 | 2010-07-30 10:29:19 +0000 | [diff] [blame] | 549 |     (Pdb) continue | 
 | 550 |     1 | 
 | 551 |     2 | 
 | 552 |     > <doctest test.test_pdb.test_pdb_continue_in_bottomframe[0]>(7)test_function() | 
 | 553 |     -> print(3) | 
 | 554 |     (Pdb) next | 
 | 555 |     3 | 
 | 556 |     > <doctest test.test_pdb.test_pdb_continue_in_bottomframe[0]>(8)test_function() | 
 | 557 |     -> print(4) | 
 | 558 |     (Pdb) continue | 
 | 559 |     4 | 
 | 560 |     """ | 
 | 561 |  | 
 | 562 |  | 
| Georg Brandl | 46b9afc | 2010-07-30 09:14:20 +0000 | [diff] [blame] | 563 | def pdb_invoke(method, arg): | 
 | 564 |     """Run pdb.method(arg).""" | 
| Łukasz Langa | 2eb6eca | 2016-09-09 22:21:17 -0700 | [diff] [blame] | 565 |     getattr(pdb.Pdb(nosigint=True, readrc=False), method)(arg) | 
| Georg Brandl | 46b9afc | 2010-07-30 09:14:20 +0000 | [diff] [blame] | 566 |  | 
 | 567 |  | 
 | 568 | def test_pdb_run_with_incorrect_argument(): | 
 | 569 |     """Testing run and runeval with incorrect first argument. | 
 | 570 |  | 
 | 571 |     >>> pti = PdbTestInput(['continue',]) | 
 | 572 |     >>> with pti: | 
 | 573 |     ...     pdb_invoke('run', lambda x: x) | 
 | 574 |     Traceback (most recent call last): | 
 | 575 |     TypeError: exec() arg 1 must be a string, bytes or code object | 
 | 576 |  | 
 | 577 |     >>> with pti: | 
 | 578 |     ...     pdb_invoke('runeval', lambda x: x) | 
 | 579 |     Traceback (most recent call last): | 
 | 580 |     TypeError: eval() arg 1 must be a string, bytes or code object | 
 | 581 |     """ | 
 | 582 |  | 
 | 583 |  | 
 | 584 | def test_pdb_run_with_code_object(): | 
 | 585 |     """Testing run and runeval with code object as a first argument. | 
 | 586 |  | 
| Georg Brandl | e1e8df1 | 2010-07-31 08:14:16 +0000 | [diff] [blame] | 587 |     >>> with PdbTestInput(['step','x', 'continue']):  # doctest: +ELLIPSIS | 
| Georg Brandl | 46b9afc | 2010-07-30 09:14:20 +0000 | [diff] [blame] | 588 |     ...     pdb_invoke('run', compile('x=1', '<string>', 'exec')) | 
| Georg Brandl | e1e8df1 | 2010-07-31 08:14:16 +0000 | [diff] [blame] | 589 |     > <string>(1)<module>()... | 
| Georg Brandl | 46b9afc | 2010-07-30 09:14:20 +0000 | [diff] [blame] | 590 |     (Pdb) step | 
 | 591 |     --Return-- | 
 | 592 |     > <string>(1)<module>()->None | 
 | 593 |     (Pdb) x | 
 | 594 |     1 | 
 | 595 |     (Pdb) continue | 
 | 596 |  | 
 | 597 |     >>> with PdbTestInput(['x', 'continue']): | 
 | 598 |     ...     x=0 | 
 | 599 |     ...     pdb_invoke('runeval', compile('x+1', '<string>', 'eval')) | 
 | 600 |     > <string>(1)<module>()->None | 
 | 601 |     (Pdb) x | 
 | 602 |     1 | 
 | 603 |     (Pdb) continue | 
 | 604 |     """ | 
 | 605 |  | 
| Guido van Rossum | 8820c23 | 2013-11-21 11:30:06 -0800 | [diff] [blame] | 606 | def test_next_until_return_at_return_event(): | 
 | 607 |     """Test that pdb stops after a next/until/return issued at a return debug event. | 
 | 608 |  | 
 | 609 |     >>> def test_function_2(): | 
 | 610 |     ...     x = 1 | 
 | 611 |     ...     x = 2 | 
 | 612 |  | 
 | 613 |     >>> def test_function(): | 
| Łukasz Langa | 2eb6eca | 2016-09-09 22:21:17 -0700 | [diff] [blame] | 614 |     ...     import pdb; pdb.Pdb(nosigint=True, readrc=False).set_trace() | 
| Guido van Rossum | 8820c23 | 2013-11-21 11:30:06 -0800 | [diff] [blame] | 615 |     ...     test_function_2() | 
 | 616 |     ...     test_function_2() | 
 | 617 |     ...     test_function_2() | 
 | 618 |     ...     end = 1 | 
 | 619 |  | 
| Antoine Pitrou | c04d468 | 2014-08-11 21:40:38 -0400 | [diff] [blame] | 620 |     >>> from bdb import Breakpoint | 
 | 621 |     >>> Breakpoint.next = 1 | 
| Guido van Rossum | 8820c23 | 2013-11-21 11:30:06 -0800 | [diff] [blame] | 622 |     >>> with PdbTestInput(['break test_function_2', | 
 | 623 |     ...                    'continue', | 
 | 624 |     ...                    'return', | 
 | 625 |     ...                    'next', | 
 | 626 |     ...                    'continue', | 
 | 627 |     ...                    'return', | 
 | 628 |     ...                    'until', | 
 | 629 |     ...                    'continue', | 
 | 630 |     ...                    'return', | 
 | 631 |     ...                    'return', | 
 | 632 |     ...                    'continue']): | 
 | 633 |     ...     test_function() | 
 | 634 |     > <doctest test.test_pdb.test_next_until_return_at_return_event[1]>(3)test_function() | 
 | 635 |     -> test_function_2() | 
 | 636 |     (Pdb) break test_function_2 | 
 | 637 |     Breakpoint 1 at <doctest test.test_pdb.test_next_until_return_at_return_event[0]>:1 | 
 | 638 |     (Pdb) continue | 
 | 639 |     > <doctest test.test_pdb.test_next_until_return_at_return_event[0]>(2)test_function_2() | 
 | 640 |     -> x = 1 | 
 | 641 |     (Pdb) return | 
 | 642 |     --Return-- | 
 | 643 |     > <doctest test.test_pdb.test_next_until_return_at_return_event[0]>(3)test_function_2()->None | 
 | 644 |     -> x = 2 | 
 | 645 |     (Pdb) next | 
 | 646 |     > <doctest test.test_pdb.test_next_until_return_at_return_event[1]>(4)test_function() | 
 | 647 |     -> test_function_2() | 
 | 648 |     (Pdb) continue | 
 | 649 |     > <doctest test.test_pdb.test_next_until_return_at_return_event[0]>(2)test_function_2() | 
 | 650 |     -> x = 1 | 
 | 651 |     (Pdb) return | 
 | 652 |     --Return-- | 
 | 653 |     > <doctest test.test_pdb.test_next_until_return_at_return_event[0]>(3)test_function_2()->None | 
 | 654 |     -> x = 2 | 
 | 655 |     (Pdb) until | 
 | 656 |     > <doctest test.test_pdb.test_next_until_return_at_return_event[1]>(5)test_function() | 
 | 657 |     -> test_function_2() | 
 | 658 |     (Pdb) continue | 
 | 659 |     > <doctest test.test_pdb.test_next_until_return_at_return_event[0]>(2)test_function_2() | 
 | 660 |     -> x = 1 | 
 | 661 |     (Pdb) return | 
 | 662 |     --Return-- | 
 | 663 |     > <doctest test.test_pdb.test_next_until_return_at_return_event[0]>(3)test_function_2()->None | 
 | 664 |     -> x = 2 | 
 | 665 |     (Pdb) return | 
 | 666 |     > <doctest test.test_pdb.test_next_until_return_at_return_event[1]>(6)test_function() | 
 | 667 |     -> end = 1 | 
 | 668 |     (Pdb) continue | 
 | 669 |     """ | 
 | 670 |  | 
 | 671 | def test_pdb_next_command_for_generator(): | 
 | 672 |     """Testing skip unwindng stack on yield for generators for "next" command | 
 | 673 |  | 
 | 674 |     >>> def test_gen(): | 
 | 675 |     ...     yield 0 | 
 | 676 |     ...     return 1 | 
 | 677 |     ...     yield 2 | 
 | 678 |  | 
 | 679 |     >>> def test_function(): | 
| Łukasz Langa | 2eb6eca | 2016-09-09 22:21:17 -0700 | [diff] [blame] | 680 |     ...     import pdb; pdb.Pdb(nosigint=True, readrc=False).set_trace() | 
| Guido van Rossum | 8820c23 | 2013-11-21 11:30:06 -0800 | [diff] [blame] | 681 |     ...     it = test_gen() | 
 | 682 |     ...     try: | 
| Serhiy Storchaka | a16de5d | 2015-04-01 16:58:19 +0300 | [diff] [blame] | 683 |     ...         if next(it) != 0: | 
 | 684 |     ...             raise AssertionError | 
| Guido van Rossum | 8820c23 | 2013-11-21 11:30:06 -0800 | [diff] [blame] | 685 |     ...         next(it) | 
 | 686 |     ...     except StopIteration as ex: | 
| Serhiy Storchaka | a16de5d | 2015-04-01 16:58:19 +0300 | [diff] [blame] | 687 |     ...         if ex.value != 1: | 
 | 688 |     ...             raise AssertionError | 
| Guido van Rossum | 8820c23 | 2013-11-21 11:30:06 -0800 | [diff] [blame] | 689 |     ...     print("finished") | 
 | 690 |  | 
 | 691 |     >>> with PdbTestInput(['step', | 
 | 692 |     ...                    'step', | 
 | 693 |     ...                    'step', | 
 | 694 |     ...                    'next', | 
 | 695 |     ...                    'next', | 
 | 696 |     ...                    'step', | 
 | 697 |     ...                    'step', | 
 | 698 |     ...                    'continue']): | 
 | 699 |     ...     test_function() | 
 | 700 |     > <doctest test.test_pdb.test_pdb_next_command_for_generator[1]>(3)test_function() | 
 | 701 |     -> it = test_gen() | 
 | 702 |     (Pdb) step | 
 | 703 |     > <doctest test.test_pdb.test_pdb_next_command_for_generator[1]>(4)test_function() | 
 | 704 |     -> try: | 
 | 705 |     (Pdb) step | 
 | 706 |     > <doctest test.test_pdb.test_pdb_next_command_for_generator[1]>(5)test_function() | 
| Serhiy Storchaka | a16de5d | 2015-04-01 16:58:19 +0300 | [diff] [blame] | 707 |     -> if next(it) != 0: | 
| Guido van Rossum | 8820c23 | 2013-11-21 11:30:06 -0800 | [diff] [blame] | 708 |     (Pdb) step | 
 | 709 |     --Call-- | 
 | 710 |     > <doctest test.test_pdb.test_pdb_next_command_for_generator[0]>(1)test_gen() | 
 | 711 |     -> def test_gen(): | 
 | 712 |     (Pdb) next | 
 | 713 |     > <doctest test.test_pdb.test_pdb_next_command_for_generator[0]>(2)test_gen() | 
 | 714 |     -> yield 0 | 
 | 715 |     (Pdb) next | 
 | 716 |     > <doctest test.test_pdb.test_pdb_next_command_for_generator[0]>(3)test_gen() | 
 | 717 |     -> return 1 | 
 | 718 |     (Pdb) step | 
 | 719 |     --Return-- | 
 | 720 |     > <doctest test.test_pdb.test_pdb_next_command_for_generator[0]>(3)test_gen()->1 | 
 | 721 |     -> return 1 | 
 | 722 |     (Pdb) step | 
 | 723 |     StopIteration: 1 | 
| Serhiy Storchaka | a16de5d | 2015-04-01 16:58:19 +0300 | [diff] [blame] | 724 |     > <doctest test.test_pdb.test_pdb_next_command_for_generator[1]>(7)test_function() | 
| Guido van Rossum | 8820c23 | 2013-11-21 11:30:06 -0800 | [diff] [blame] | 725 |     -> next(it) | 
 | 726 |     (Pdb) continue | 
 | 727 |     finished | 
 | 728 |     """ | 
 | 729 |  | 
| Pablo Galindo | 4687702 | 2018-01-29 00:25:05 +0000 | [diff] [blame] | 730 | def test_pdb_next_command_for_coroutine(): | 
 | 731 |     """Testing skip unwindng stack on yield for coroutines for "next" command | 
 | 732 |  | 
 | 733 |     >>> import asyncio | 
 | 734 |  | 
 | 735 |     >>> async def test_coro(): | 
 | 736 |     ...     await asyncio.sleep(0) | 
 | 737 |     ...     await asyncio.sleep(0) | 
 | 738 |     ...     await asyncio.sleep(0) | 
 | 739 |  | 
 | 740 |     >>> async def test_main(): | 
 | 741 |     ...     import pdb; pdb.Pdb(nosigint=True, readrc=False).set_trace() | 
 | 742 |     ...     await test_coro() | 
 | 743 |  | 
 | 744 |     >>> def test_function(): | 
| Pablo Galindo | c7ab581 | 2018-01-29 01:31:00 +0000 | [diff] [blame] | 745 |     ...     loop = asyncio.new_event_loop() | 
| Pablo Galindo | 4687702 | 2018-01-29 00:25:05 +0000 | [diff] [blame] | 746 |     ...     loop.run_until_complete(test_main()) | 
 | 747 |     ...     loop.close() | 
 | 748 |     ...     print("finished") | 
 | 749 |  | 
 | 750 |     >>> with PdbTestInput(['step', | 
 | 751 |     ...                    'step', | 
 | 752 |     ...                    'next', | 
 | 753 |     ...                    'next', | 
 | 754 |     ...                    'next', | 
 | 755 |     ...                    'step', | 
 | 756 |     ...                    'continue']): | 
 | 757 |     ...     test_function() | 
 | 758 |     > <doctest test.test_pdb.test_pdb_next_command_for_coroutine[2]>(3)test_main() | 
 | 759 |     -> await test_coro() | 
 | 760 |     (Pdb) step | 
 | 761 |     --Call-- | 
 | 762 |     > <doctest test.test_pdb.test_pdb_next_command_for_coroutine[1]>(1)test_coro() | 
 | 763 |     -> async def test_coro(): | 
 | 764 |     (Pdb) step | 
 | 765 |     > <doctest test.test_pdb.test_pdb_next_command_for_coroutine[1]>(2)test_coro() | 
 | 766 |     -> await asyncio.sleep(0) | 
 | 767 |     (Pdb) next | 
 | 768 |     > <doctest test.test_pdb.test_pdb_next_command_for_coroutine[1]>(3)test_coro() | 
 | 769 |     -> await asyncio.sleep(0) | 
 | 770 |     (Pdb) next | 
 | 771 |     > <doctest test.test_pdb.test_pdb_next_command_for_coroutine[1]>(4)test_coro() | 
 | 772 |     -> await asyncio.sleep(0) | 
 | 773 |     (Pdb) next | 
 | 774 |     Internal StopIteration | 
 | 775 |     > <doctest test.test_pdb.test_pdb_next_command_for_coroutine[2]>(3)test_main() | 
 | 776 |     -> await test_coro() | 
 | 777 |     (Pdb) step | 
 | 778 |     --Return-- | 
 | 779 |     > <doctest test.test_pdb.test_pdb_next_command_for_coroutine[2]>(3)test_main()->None | 
 | 780 |     -> await test_coro() | 
 | 781 |     (Pdb) continue | 
 | 782 |     finished | 
 | 783 |     """ | 
 | 784 |  | 
| Yury Selivanov | 9ee1bf9 | 2018-01-28 22:43:46 -0500 | [diff] [blame] | 785 | def test_pdb_next_command_for_asyncgen(): | 
 | 786 |     """Testing skip unwindng stack on yield for coroutines for "next" command | 
 | 787 |  | 
 | 788 |     >>> import asyncio | 
 | 789 |  | 
 | 790 |     >>> async def agen(): | 
 | 791 |     ...     yield 1 | 
 | 792 |     ...     await asyncio.sleep(0) | 
 | 793 |     ...     yield 2 | 
 | 794 |  | 
 | 795 |     >>> async def test_coro(): | 
 | 796 |     ...     async for x in agen(): | 
 | 797 |     ...         print(x) | 
 | 798 |  | 
 | 799 |     >>> async def test_main(): | 
 | 800 |     ...     import pdb; pdb.Pdb(nosigint=True, readrc=False).set_trace() | 
 | 801 |     ...     await test_coro() | 
 | 802 |  | 
 | 803 |     >>> def test_function(): | 
 | 804 |     ...     loop = asyncio.new_event_loop() | 
 | 805 |     ...     loop.run_until_complete(test_main()) | 
 | 806 |     ...     loop.close() | 
 | 807 |     ...     print("finished") | 
 | 808 |  | 
 | 809 |     >>> with PdbTestInput(['step', | 
 | 810 |     ...                    'step', | 
 | 811 |     ...                    'next', | 
 | 812 |     ...                    'next', | 
 | 813 |     ...                    'step', | 
 | 814 |     ...                    'next', | 
 | 815 |     ...                    'continue']): | 
 | 816 |     ...     test_function() | 
 | 817 |     > <doctest test.test_pdb.test_pdb_next_command_for_asyncgen[3]>(3)test_main() | 
 | 818 |     -> await test_coro() | 
 | 819 |     (Pdb) step | 
 | 820 |     --Call-- | 
 | 821 |     > <doctest test.test_pdb.test_pdb_next_command_for_asyncgen[2]>(1)test_coro() | 
 | 822 |     -> async def test_coro(): | 
 | 823 |     (Pdb) step | 
 | 824 |     > <doctest test.test_pdb.test_pdb_next_command_for_asyncgen[2]>(2)test_coro() | 
 | 825 |     -> async for x in agen(): | 
 | 826 |     (Pdb) next | 
 | 827 |     > <doctest test.test_pdb.test_pdb_next_command_for_asyncgen[2]>(3)test_coro() | 
 | 828 |     -> print(x) | 
 | 829 |     (Pdb) next | 
 | 830 |     1 | 
 | 831 |     > <doctest test.test_pdb.test_pdb_next_command_for_asyncgen[2]>(2)test_coro() | 
 | 832 |     -> async for x in agen(): | 
 | 833 |     (Pdb) step | 
 | 834 |     --Call-- | 
 | 835 |     > <doctest test.test_pdb.test_pdb_next_command_for_asyncgen[1]>(2)agen() | 
 | 836 |     -> yield 1 | 
 | 837 |     (Pdb) next | 
 | 838 |     > <doctest test.test_pdb.test_pdb_next_command_for_asyncgen[1]>(3)agen() | 
 | 839 |     -> await asyncio.sleep(0) | 
 | 840 |     (Pdb) continue | 
 | 841 |     2 | 
 | 842 |     finished | 
 | 843 |     """ | 
 | 844 |  | 
| Guido van Rossum | 8820c23 | 2013-11-21 11:30:06 -0800 | [diff] [blame] | 845 | def test_pdb_return_command_for_generator(): | 
 | 846 |     """Testing no unwindng stack on yield for generators | 
 | 847 |        for "return" command | 
 | 848 |  | 
 | 849 |     >>> def test_gen(): | 
 | 850 |     ...     yield 0 | 
 | 851 |     ...     return 1 | 
 | 852 |     ...     yield 2 | 
 | 853 |  | 
 | 854 |     >>> def test_function(): | 
| Łukasz Langa | 2eb6eca | 2016-09-09 22:21:17 -0700 | [diff] [blame] | 855 |     ...     import pdb; pdb.Pdb(nosigint=True, readrc=False).set_trace() | 
| Guido van Rossum | 8820c23 | 2013-11-21 11:30:06 -0800 | [diff] [blame] | 856 |     ...     it = test_gen() | 
 | 857 |     ...     try: | 
| Serhiy Storchaka | a16de5d | 2015-04-01 16:58:19 +0300 | [diff] [blame] | 858 |     ...         if next(it) != 0: | 
 | 859 |     ...             raise AssertionError | 
| Guido van Rossum | 8820c23 | 2013-11-21 11:30:06 -0800 | [diff] [blame] | 860 |     ...         next(it) | 
 | 861 |     ...     except StopIteration as ex: | 
| Serhiy Storchaka | a16de5d | 2015-04-01 16:58:19 +0300 | [diff] [blame] | 862 |     ...         if ex.value != 1: | 
 | 863 |     ...             raise AssertionError | 
| Guido van Rossum | 8820c23 | 2013-11-21 11:30:06 -0800 | [diff] [blame] | 864 |     ...     print("finished") | 
 | 865 |  | 
 | 866 |     >>> with PdbTestInput(['step', | 
 | 867 |     ...                    'step', | 
 | 868 |     ...                    'step', | 
 | 869 |     ...                    'return', | 
 | 870 |     ...                    'step', | 
 | 871 |     ...                    'step', | 
 | 872 |     ...                    'continue']): | 
 | 873 |     ...     test_function() | 
 | 874 |     > <doctest test.test_pdb.test_pdb_return_command_for_generator[1]>(3)test_function() | 
 | 875 |     -> it = test_gen() | 
 | 876 |     (Pdb) step | 
 | 877 |     > <doctest test.test_pdb.test_pdb_return_command_for_generator[1]>(4)test_function() | 
 | 878 |     -> try: | 
 | 879 |     (Pdb) step | 
 | 880 |     > <doctest test.test_pdb.test_pdb_return_command_for_generator[1]>(5)test_function() | 
| Serhiy Storchaka | a16de5d | 2015-04-01 16:58:19 +0300 | [diff] [blame] | 881 |     -> if next(it) != 0: | 
| Guido van Rossum | 8820c23 | 2013-11-21 11:30:06 -0800 | [diff] [blame] | 882 |     (Pdb) step | 
 | 883 |     --Call-- | 
 | 884 |     > <doctest test.test_pdb.test_pdb_return_command_for_generator[0]>(1)test_gen() | 
 | 885 |     -> def test_gen(): | 
 | 886 |     (Pdb) return | 
 | 887 |     StopIteration: 1 | 
| Serhiy Storchaka | a16de5d | 2015-04-01 16:58:19 +0300 | [diff] [blame] | 888 |     > <doctest test.test_pdb.test_pdb_return_command_for_generator[1]>(7)test_function() | 
| Guido van Rossum | 8820c23 | 2013-11-21 11:30:06 -0800 | [diff] [blame] | 889 |     -> next(it) | 
 | 890 |     (Pdb) step | 
| Serhiy Storchaka | a16de5d | 2015-04-01 16:58:19 +0300 | [diff] [blame] | 891 |     > <doctest test.test_pdb.test_pdb_return_command_for_generator[1]>(8)test_function() | 
| Guido van Rossum | 8820c23 | 2013-11-21 11:30:06 -0800 | [diff] [blame] | 892 |     -> except StopIteration as ex: | 
 | 893 |     (Pdb) step | 
| Serhiy Storchaka | a16de5d | 2015-04-01 16:58:19 +0300 | [diff] [blame] | 894 |     > <doctest test.test_pdb.test_pdb_return_command_for_generator[1]>(9)test_function() | 
 | 895 |     -> if ex.value != 1: | 
| Guido van Rossum | 8820c23 | 2013-11-21 11:30:06 -0800 | [diff] [blame] | 896 |     (Pdb) continue | 
 | 897 |     finished | 
 | 898 |     """ | 
 | 899 |  | 
| Pablo Galindo | c7ab581 | 2018-01-29 01:31:00 +0000 | [diff] [blame] | 900 | def test_pdb_return_command_for_coroutine(): | 
 | 901 |     """Testing no unwindng stack on yield for coroutines for "return" command | 
 | 902 |  | 
 | 903 |     >>> import asyncio | 
 | 904 |  | 
 | 905 |     >>> async def test_coro(): | 
 | 906 |     ...     await asyncio.sleep(0) | 
 | 907 |     ...     await asyncio.sleep(0) | 
 | 908 |     ...     await asyncio.sleep(0) | 
 | 909 |  | 
 | 910 |     >>> async def test_main(): | 
 | 911 |     ...     import pdb; pdb.Pdb(nosigint=True, readrc=False).set_trace() | 
 | 912 |     ...     await test_coro() | 
 | 913 |  | 
 | 914 |     >>> def test_function(): | 
 | 915 |     ...     loop = asyncio.new_event_loop() | 
 | 916 |     ...     loop.run_until_complete(test_main()) | 
 | 917 |     ...     loop.close() | 
 | 918 |     ...     print("finished") | 
 | 919 |  | 
 | 920 |     >>> with PdbTestInput(['step', | 
 | 921 |     ...                    'step', | 
 | 922 |     ...                    'next', | 
 | 923 |     ...                    'continue']): | 
 | 924 |     ...     test_function() | 
 | 925 |     > <doctest test.test_pdb.test_pdb_return_command_for_coroutine[2]>(3)test_main() | 
 | 926 |     -> await test_coro() | 
 | 927 |     (Pdb) step | 
 | 928 |     --Call-- | 
 | 929 |     > <doctest test.test_pdb.test_pdb_return_command_for_coroutine[1]>(1)test_coro() | 
 | 930 |     -> async def test_coro(): | 
 | 931 |     (Pdb) step | 
 | 932 |     > <doctest test.test_pdb.test_pdb_return_command_for_coroutine[1]>(2)test_coro() | 
 | 933 |     -> await asyncio.sleep(0) | 
 | 934 |     (Pdb) next | 
 | 935 |     > <doctest test.test_pdb.test_pdb_return_command_for_coroutine[1]>(3)test_coro() | 
 | 936 |     -> await asyncio.sleep(0) | 
 | 937 |     (Pdb) continue | 
 | 938 |     finished | 
 | 939 |     """ | 
 | 940 |  | 
| Guido van Rossum | 8820c23 | 2013-11-21 11:30:06 -0800 | [diff] [blame] | 941 | def test_pdb_until_command_for_generator(): | 
 | 942 |     """Testing no unwindng stack on yield for generators | 
 | 943 |        for "until" command if target breakpoing is not reached | 
 | 944 |  | 
 | 945 |     >>> def test_gen(): | 
 | 946 |     ...     yield 0 | 
 | 947 |     ...     yield 1 | 
 | 948 |     ...     yield 2 | 
 | 949 |  | 
 | 950 |     >>> def test_function(): | 
| Łukasz Langa | 2eb6eca | 2016-09-09 22:21:17 -0700 | [diff] [blame] | 951 |     ...     import pdb; pdb.Pdb(nosigint=True, readrc=False).set_trace() | 
| Guido van Rossum | 8820c23 | 2013-11-21 11:30:06 -0800 | [diff] [blame] | 952 |     ...     for i in test_gen(): | 
 | 953 |     ...         print(i) | 
 | 954 |     ...     print("finished") | 
 | 955 |  | 
 | 956 |     >>> with PdbTestInput(['step', | 
 | 957 |     ...                    'until 4', | 
 | 958 |     ...                    'step', | 
 | 959 |     ...                    'step', | 
 | 960 |     ...                    'continue']): | 
 | 961 |     ...     test_function() | 
 | 962 |     > <doctest test.test_pdb.test_pdb_until_command_for_generator[1]>(3)test_function() | 
 | 963 |     -> for i in test_gen(): | 
 | 964 |     (Pdb) step | 
 | 965 |     --Call-- | 
 | 966 |     > <doctest test.test_pdb.test_pdb_until_command_for_generator[0]>(1)test_gen() | 
 | 967 |     -> def test_gen(): | 
 | 968 |     (Pdb) until 4 | 
 | 969 |     0 | 
 | 970 |     1 | 
 | 971 |     > <doctest test.test_pdb.test_pdb_until_command_for_generator[0]>(4)test_gen() | 
 | 972 |     -> yield 2 | 
 | 973 |     (Pdb) step | 
 | 974 |     --Return-- | 
 | 975 |     > <doctest test.test_pdb.test_pdb_until_command_for_generator[0]>(4)test_gen()->2 | 
 | 976 |     -> yield 2 | 
 | 977 |     (Pdb) step | 
 | 978 |     > <doctest test.test_pdb.test_pdb_until_command_for_generator[1]>(4)test_function() | 
 | 979 |     -> print(i) | 
 | 980 |     (Pdb) continue | 
 | 981 |     2 | 
 | 982 |     finished | 
 | 983 |     """ | 
 | 984 |  | 
| Andrew Svetlov | 4f4ef0a | 2018-01-29 16:17:45 +0200 | [diff] [blame^] | 985 | def test_pdb_until_command_for_coroutine(): | 
 | 986 |     """Testing no unwindng stack for coroutines | 
 | 987 |        for "until" command if target breakpoing is not reached | 
 | 988 |  | 
 | 989 |     >>> import asyncio | 
 | 990 |  | 
 | 991 |     >>> async def test_coro(): | 
 | 992 |     ...     print(0) | 
 | 993 |     ...     await asyncio.sleep(0) | 
 | 994 |     ...     print(1) | 
 | 995 |     ...     await asyncio.sleep(0) | 
 | 996 |     ...     print(2) | 
 | 997 |     ...     await asyncio.sleep(0) | 
 | 998 |     ...     print(3) | 
 | 999 |  | 
 | 1000 |     >>> async def test_main(): | 
 | 1001 |     ...     import pdb; pdb.Pdb(nosigint=True, readrc=False).set_trace() | 
 | 1002 |     ...     await test_coro() | 
 | 1003 |  | 
 | 1004 |     >>> def test_function(): | 
 | 1005 |     ...     loop = asyncio.new_event_loop() | 
 | 1006 |     ...     loop.run_until_complete(test_main()) | 
 | 1007 |     ...     loop.close() | 
 | 1008 |     ...     print("finished") | 
 | 1009 |  | 
 | 1010 |     >>> with PdbTestInput(['step', | 
 | 1011 |     ...                    'until 8', | 
 | 1012 |     ...                    'continue']): | 
 | 1013 |     ...     test_function() | 
 | 1014 |     > <doctest test.test_pdb.test_pdb_until_command_for_coroutine[2]>(3)test_main() | 
 | 1015 |     -> await test_coro() | 
 | 1016 |     (Pdb) step | 
 | 1017 |     --Call-- | 
 | 1018 |     > <doctest test.test_pdb.test_pdb_until_command_for_coroutine[1]>(1)test_coro() | 
 | 1019 |     -> async def test_coro(): | 
 | 1020 |     (Pdb) until 8 | 
 | 1021 |     0 | 
 | 1022 |     1 | 
 | 1023 |     2 | 
 | 1024 |     > <doctest test.test_pdb.test_pdb_until_command_for_coroutine[1]>(8)test_coro() | 
 | 1025 |     -> print(3) | 
 | 1026 |     (Pdb) continue | 
 | 1027 |     3 | 
 | 1028 |     finished | 
 | 1029 |     """ | 
 | 1030 |  | 
| Guido van Rossum | 8820c23 | 2013-11-21 11:30:06 -0800 | [diff] [blame] | 1031 | def test_pdb_next_command_in_generator_for_loop(): | 
| Martin Panter | 46f5072 | 2016-05-26 05:35:26 +0000 | [diff] [blame] | 1032 |     """The next command on returning from a generator controlled by a for loop. | 
| Guido van Rossum | 8820c23 | 2013-11-21 11:30:06 -0800 | [diff] [blame] | 1033 |  | 
 | 1034 |     >>> def test_gen(): | 
 | 1035 |     ...     yield 0 | 
 | 1036 |     ...     return 1 | 
 | 1037 |  | 
 | 1038 |     >>> def test_function(): | 
| Łukasz Langa | 2eb6eca | 2016-09-09 22:21:17 -0700 | [diff] [blame] | 1039 |     ...     import pdb; pdb.Pdb(nosigint=True, readrc=False).set_trace() | 
| Guido van Rossum | 8820c23 | 2013-11-21 11:30:06 -0800 | [diff] [blame] | 1040 |     ...     for i in test_gen(): | 
 | 1041 |     ...         print('value', i) | 
 | 1042 |     ...     x = 123 | 
 | 1043 |  | 
 | 1044 |     >>> with PdbTestInput(['break test_gen', | 
 | 1045 |     ...                    'continue', | 
 | 1046 |     ...                    'next', | 
 | 1047 |     ...                    'next', | 
 | 1048 |     ...                    'next', | 
 | 1049 |     ...                    'continue']): | 
 | 1050 |     ...     test_function() | 
 | 1051 |     > <doctest test.test_pdb.test_pdb_next_command_in_generator_for_loop[1]>(3)test_function() | 
 | 1052 |     -> for i in test_gen(): | 
 | 1053 |     (Pdb) break test_gen | 
 | 1054 |     Breakpoint 6 at <doctest test.test_pdb.test_pdb_next_command_in_generator_for_loop[0]>:1 | 
 | 1055 |     (Pdb) continue | 
 | 1056 |     > <doctest test.test_pdb.test_pdb_next_command_in_generator_for_loop[0]>(2)test_gen() | 
 | 1057 |     -> yield 0 | 
 | 1058 |     (Pdb) next | 
 | 1059 |     value 0 | 
 | 1060 |     > <doctest test.test_pdb.test_pdb_next_command_in_generator_for_loop[0]>(3)test_gen() | 
 | 1061 |     -> return 1 | 
 | 1062 |     (Pdb) next | 
 | 1063 |     Internal StopIteration: 1 | 
 | 1064 |     > <doctest test.test_pdb.test_pdb_next_command_in_generator_for_loop[1]>(3)test_function() | 
 | 1065 |     -> for i in test_gen(): | 
 | 1066 |     (Pdb) next | 
 | 1067 |     > <doctest test.test_pdb.test_pdb_next_command_in_generator_for_loop[1]>(5)test_function() | 
 | 1068 |     -> x = 123 | 
 | 1069 |     (Pdb) continue | 
 | 1070 |     """ | 
 | 1071 |  | 
 | 1072 | def test_pdb_next_command_subiterator(): | 
 | 1073 |     """The next command in a generator with a subiterator. | 
 | 1074 |  | 
 | 1075 |     >>> def test_subgenerator(): | 
 | 1076 |     ...     yield 0 | 
 | 1077 |     ...     return 1 | 
 | 1078 |  | 
 | 1079 |     >>> def test_gen(): | 
 | 1080 |     ...     x = yield from test_subgenerator() | 
 | 1081 |     ...     return x | 
 | 1082 |  | 
 | 1083 |     >>> def test_function(): | 
| Łukasz Langa | 2eb6eca | 2016-09-09 22:21:17 -0700 | [diff] [blame] | 1084 |     ...     import pdb; pdb.Pdb(nosigint=True, readrc=False).set_trace() | 
| Guido van Rossum | 8820c23 | 2013-11-21 11:30:06 -0800 | [diff] [blame] | 1085 |     ...     for i in test_gen(): | 
 | 1086 |     ...         print('value', i) | 
 | 1087 |     ...     x = 123 | 
 | 1088 |  | 
 | 1089 |     >>> with PdbTestInput(['step', | 
 | 1090 |     ...                    'step', | 
 | 1091 |     ...                    'next', | 
 | 1092 |     ...                    'next', | 
 | 1093 |     ...                    'next', | 
 | 1094 |     ...                    'continue']): | 
 | 1095 |     ...     test_function() | 
 | 1096 |     > <doctest test.test_pdb.test_pdb_next_command_subiterator[2]>(3)test_function() | 
 | 1097 |     -> for i in test_gen(): | 
 | 1098 |     (Pdb) step | 
 | 1099 |     --Call-- | 
 | 1100 |     > <doctest test.test_pdb.test_pdb_next_command_subiterator[1]>(1)test_gen() | 
 | 1101 |     -> def test_gen(): | 
 | 1102 |     (Pdb) step | 
 | 1103 |     > <doctest test.test_pdb.test_pdb_next_command_subiterator[1]>(2)test_gen() | 
 | 1104 |     -> x = yield from test_subgenerator() | 
 | 1105 |     (Pdb) next | 
 | 1106 |     value 0 | 
 | 1107 |     > <doctest test.test_pdb.test_pdb_next_command_subiterator[1]>(3)test_gen() | 
 | 1108 |     -> return x | 
 | 1109 |     (Pdb) next | 
 | 1110 |     Internal StopIteration: 1 | 
 | 1111 |     > <doctest test.test_pdb.test_pdb_next_command_subiterator[2]>(3)test_function() | 
 | 1112 |     -> for i in test_gen(): | 
 | 1113 |     (Pdb) next | 
 | 1114 |     > <doctest test.test_pdb.test_pdb_next_command_subiterator[2]>(5)test_function() | 
 | 1115 |     -> x = 123 | 
 | 1116 |     (Pdb) continue | 
 | 1117 |     """ | 
 | 1118 |  | 
| Xavier de Gaye | 10e54ae | 2016-10-12 20:13:24 +0200 | [diff] [blame] | 1119 | def test_pdb_issue_20766(): | 
 | 1120 |     """Test for reference leaks when the SIGINT handler is set. | 
 | 1121 |  | 
 | 1122 |     >>> def test_function(): | 
 | 1123 |     ...     i = 1 | 
 | 1124 |     ...     while i <= 2: | 
 | 1125 |     ...         sess = pdb.Pdb() | 
 | 1126 |     ...         sess.set_trace(sys._getframe()) | 
 | 1127 |     ...         print('pdb %d: %s' % (i, sess._previous_sigint_handler)) | 
 | 1128 |     ...         i += 1 | 
 | 1129 |  | 
 | 1130 |     >>> with PdbTestInput(['continue', | 
 | 1131 |     ...                    'continue']): | 
 | 1132 |     ...     test_function() | 
 | 1133 |     > <doctest test.test_pdb.test_pdb_issue_20766[0]>(6)test_function() | 
 | 1134 |     -> print('pdb %d: %s' % (i, sess._previous_sigint_handler)) | 
 | 1135 |     (Pdb) continue | 
 | 1136 |     pdb 1: <built-in function default_int_handler> | 
 | 1137 |     > <doctest test.test_pdb.test_pdb_issue_20766[0]>(5)test_function() | 
 | 1138 |     -> sess.set_trace(sys._getframe()) | 
 | 1139 |     (Pdb) continue | 
 | 1140 |     pdb 2: <built-in function default_int_handler> | 
 | 1141 |     """ | 
| Georg Brandl | 46b9afc | 2010-07-30 09:14:20 +0000 | [diff] [blame] | 1142 |  | 
| Georg Brandl | 6cccb86 | 2010-07-30 14:16:43 +0000 | [diff] [blame] | 1143 |  | 
| Mario Corchero | 9f1e5f1 | 2018-01-06 07:53:05 +0000 | [diff] [blame] | 1144 | class PdbTestCase(unittest.TestCase): | 
 | 1145 |     def tearDown(self): | 
 | 1146 |         support.unlink(support.TESTFN) | 
 | 1147 |  | 
 | 1148 |     def _run_pdb(self, pdb_args, commands): | 
 | 1149 |         self.addCleanup(support.rmtree, '__pycache__') | 
 | 1150 |         cmd = [sys.executable, '-m', 'pdb'] + pdb_args | 
 | 1151 |         with subprocess.Popen( | 
 | 1152 |                 cmd, | 
 | 1153 |                 stdout=subprocess.PIPE, | 
 | 1154 |                 stdin=subprocess.PIPE, | 
 | 1155 |                 stderr=subprocess.STDOUT, | 
 | 1156 |         ) as proc: | 
 | 1157 |             stdout, stderr = proc.communicate(str.encode(commands)) | 
 | 1158 |         stdout = stdout and bytes.decode(stdout) | 
 | 1159 |         stderr = stderr and bytes.decode(stderr) | 
 | 1160 |         return stdout, stderr | 
 | 1161 |  | 
 | 1162 |     def run_pdb_script(self, script, commands): | 
| Senthil Kumaran | 42d7081 | 2012-05-01 10:07:49 +0800 | [diff] [blame] | 1163 |         """Run 'script' lines with pdb and the pdb 'commands'.""" | 
 | 1164 |         filename = 'main.py' | 
 | 1165 |         with open(filename, 'w') as f: | 
 | 1166 |             f.write(textwrap.dedent(script)) | 
| Georg Brandl | 4bde9ca | 2012-05-01 09:21:16 +0200 | [diff] [blame] | 1167 |         self.addCleanup(support.unlink, filename) | 
| Mario Corchero | 9f1e5f1 | 2018-01-06 07:53:05 +0000 | [diff] [blame] | 1168 |         return self._run_pdb([filename], commands) | 
 | 1169 |  | 
 | 1170 |     def run_pdb_module(self, script, commands): | 
 | 1171 |         """Runs the script code as part of a module""" | 
 | 1172 |         self.module_name = 't_main' | 
 | 1173 |         support.rmtree(self.module_name) | 
 | 1174 |         main_file = self.module_name + '/__main__.py' | 
 | 1175 |         init_file = self.module_name + '/__init__.py' | 
 | 1176 |         os.mkdir(self.module_name) | 
 | 1177 |         with open(init_file, 'w') as f: | 
 | 1178 |             pass | 
 | 1179 |         with open(main_file, 'w') as f: | 
 | 1180 |             f.write(textwrap.dedent(script)) | 
 | 1181 |         self.addCleanup(support.rmtree, self.module_name) | 
 | 1182 |         return self._run_pdb(['-m', self.module_name], commands) | 
| Senthil Kumaran | 42d7081 | 2012-05-01 10:07:49 +0800 | [diff] [blame] | 1183 |  | 
| Georg Brandl | 6e22055 | 2013-10-13 20:51:47 +0200 | [diff] [blame] | 1184 |     def _assert_find_function(self, file_content, func_name, expected): | 
 | 1185 |         file_content = textwrap.dedent(file_content) | 
 | 1186 |  | 
 | 1187 |         with open(support.TESTFN, 'w') as f: | 
 | 1188 |             f.write(file_content) | 
 | 1189 |  | 
 | 1190 |         expected = None if not expected else ( | 
 | 1191 |             expected[0], support.TESTFN, expected[1]) | 
 | 1192 |         self.assertEqual( | 
 | 1193 |             expected, pdb.find_function(func_name, support.TESTFN)) | 
 | 1194 |  | 
 | 1195 |     def test_find_function_empty_file(self): | 
 | 1196 |         self._assert_find_function('', 'foo', None) | 
 | 1197 |  | 
 | 1198 |     def test_find_function_found(self): | 
 | 1199 |         self._assert_find_function( | 
 | 1200 |             """\ | 
 | 1201 |             def foo(): | 
 | 1202 |                 pass | 
 | 1203 |  | 
 | 1204 |             def bar(): | 
 | 1205 |                 pass | 
 | 1206 |  | 
 | 1207 |             def quux(): | 
 | 1208 |                 pass | 
 | 1209 |             """, | 
 | 1210 |             'bar', | 
 | 1211 |             ('bar', 4), | 
 | 1212 |         ) | 
 | 1213 |  | 
| Georg Brandl | 6cccb86 | 2010-07-30 14:16:43 +0000 | [diff] [blame] | 1214 |     def test_issue7964(self): | 
 | 1215 |         # open the file as binary so we can force \r\n newline | 
 | 1216 |         with open(support.TESTFN, 'wb') as f: | 
 | 1217 |             f.write(b'print("testing my pdb")\r\n') | 
 | 1218 |         cmd = [sys.executable, '-m', 'pdb', support.TESTFN] | 
 | 1219 |         proc = subprocess.Popen(cmd, | 
 | 1220 |             stdout=subprocess.PIPE, | 
 | 1221 |             stdin=subprocess.PIPE, | 
 | 1222 |             stderr=subprocess.STDOUT, | 
 | 1223 |             ) | 
| Brian Curtin | 994ad6c | 2010-11-05 15:38:47 +0000 | [diff] [blame] | 1224 |         self.addCleanup(proc.stdout.close) | 
| Georg Brandl | 6cccb86 | 2010-07-30 14:16:43 +0000 | [diff] [blame] | 1225 |         stdout, stderr = proc.communicate(b'quit\n') | 
 | 1226 |         self.assertNotIn(b'SyntaxError', stdout, | 
 | 1227 |                          "Got a syntax error running test script under PDB") | 
 | 1228 |  | 
| Senthil Kumaran | 42d7081 | 2012-05-01 10:07:49 +0800 | [diff] [blame] | 1229 |     def test_issue13183(self): | 
 | 1230 |         script = """ | 
 | 1231 |             from bar import bar | 
 | 1232 |  | 
 | 1233 |             def foo(): | 
 | 1234 |                 bar() | 
 | 1235 |  | 
 | 1236 |             def nope(): | 
 | 1237 |                 pass | 
 | 1238 |  | 
 | 1239 |             def foobar(): | 
 | 1240 |                 foo() | 
 | 1241 |                 nope() | 
 | 1242 |  | 
 | 1243 |             foobar() | 
 | 1244 |         """ | 
 | 1245 |         commands = """ | 
 | 1246 |             from bar import bar | 
 | 1247 |             break bar | 
 | 1248 |             continue | 
 | 1249 |             step | 
 | 1250 |             step | 
 | 1251 |             quit | 
 | 1252 |         """ | 
 | 1253 |         bar = """ | 
 | 1254 |             def bar(): | 
| Senthil Kumaran | cb17204 | 2012-05-02 08:00:22 +0800 | [diff] [blame] | 1255 |                 pass | 
| Senthil Kumaran | 42d7081 | 2012-05-01 10:07:49 +0800 | [diff] [blame] | 1256 |         """ | 
 | 1257 |         with open('bar.py', 'w') as f: | 
 | 1258 |             f.write(textwrap.dedent(bar)) | 
| Georg Brandl | 4bde9ca | 2012-05-01 09:21:16 +0200 | [diff] [blame] | 1259 |         self.addCleanup(support.unlink, 'bar.py') | 
| Mario Corchero | 9f1e5f1 | 2018-01-06 07:53:05 +0000 | [diff] [blame] | 1260 |         stdout, stderr = self.run_pdb_script(script, commands) | 
| Georg Brandl | 4bde9ca | 2012-05-01 09:21:16 +0200 | [diff] [blame] | 1261 |         self.assertTrue( | 
 | 1262 |             any('main.py(5)foo()->None' in l for l in stdout.splitlines()), | 
 | 1263 |             'Fail to step into the caller after a return') | 
| Senthil Kumaran | 42d7081 | 2012-05-01 10:07:49 +0800 | [diff] [blame] | 1264 |  | 
| Andrew Svetlov | 539ee5d | 2012-12-04 21:08:28 +0200 | [diff] [blame] | 1265 |     def test_issue13210(self): | 
 | 1266 |         # invoking "continue" on a non-main thread triggered an exception | 
 | 1267 |         # inside signal.signal | 
 | 1268 |  | 
 | 1269 |         with open(support.TESTFN, 'wb') as f: | 
 | 1270 |             f.write(textwrap.dedent(""" | 
 | 1271 |                 import threading | 
 | 1272 |                 import pdb | 
 | 1273 |  | 
 | 1274 |                 def start_pdb(): | 
| Łukasz Langa | 2eb6eca | 2016-09-09 22:21:17 -0700 | [diff] [blame] | 1275 |                     pdb.Pdb(readrc=False).set_trace() | 
| Andrew Svetlov | 539ee5d | 2012-12-04 21:08:28 +0200 | [diff] [blame] | 1276 |                     x = 1 | 
 | 1277 |                     y = 1 | 
 | 1278 |  | 
 | 1279 |                 t = threading.Thread(target=start_pdb) | 
 | 1280 |                 t.start()""").encode('ascii')) | 
 | 1281 |         cmd = [sys.executable, '-u', support.TESTFN] | 
 | 1282 |         proc = subprocess.Popen(cmd, | 
 | 1283 |             stdout=subprocess.PIPE, | 
 | 1284 |             stdin=subprocess.PIPE, | 
 | 1285 |             stderr=subprocess.STDOUT, | 
 | 1286 |             ) | 
 | 1287 |         self.addCleanup(proc.stdout.close) | 
 | 1288 |         stdout, stderr = proc.communicate(b'cont\n') | 
 | 1289 |         self.assertNotIn('Error', stdout.decode(), | 
 | 1290 |                          "Got an error running test script under PDB") | 
 | 1291 |  | 
| Terry Jan Reedy | ca3f435 | 2015-09-05 19:13:26 -0400 | [diff] [blame] | 1292 |     def test_issue16180(self): | 
 | 1293 |         # A syntax error in the debuggee. | 
 | 1294 |         script = "def f: pass\n" | 
 | 1295 |         commands = '' | 
 | 1296 |         expected = "SyntaxError:" | 
| Mario Corchero | 9f1e5f1 | 2018-01-06 07:53:05 +0000 | [diff] [blame] | 1297 |         stdout, stderr = self.run_pdb_script(script, commands) | 
| Terry Jan Reedy | ca3f435 | 2015-09-05 19:13:26 -0400 | [diff] [blame] | 1298 |         self.assertIn(expected, stdout, | 
 | 1299 |             '\n\nExpected:\n{}\nGot:\n{}\n' | 
 | 1300 |             'Fail to handle a syntax error in the debuggee.' | 
 | 1301 |             .format(expected, stdout)) | 
 | 1302 |  | 
 | 1303 |  | 
| Łukasz Langa | 2eb6eca | 2016-09-09 22:21:17 -0700 | [diff] [blame] | 1304 |     def test_readrc_kwarg(self): | 
| Victor Stinner | 11ea044 | 2016-09-09 22:56:54 -0700 | [diff] [blame] | 1305 |         script = textwrap.dedent(""" | 
 | 1306 |             import pdb; pdb.Pdb(readrc=False).set_trace() | 
| Łukasz Langa | 2eb6eca | 2016-09-09 22:21:17 -0700 | [diff] [blame] | 1307 |  | 
| Victor Stinner | 11ea044 | 2016-09-09 22:56:54 -0700 | [diff] [blame] | 1308 |             print('hello') | 
 | 1309 |         """) | 
| Victor Stinner | 11ea044 | 2016-09-09 22:56:54 -0700 | [diff] [blame] | 1310 |  | 
| Victor Stinner | bc62626 | 2016-09-09 23:22:09 -0700 | [diff] [blame] | 1311 |         save_home = os.environ.pop('HOME', None) | 
 | 1312 |         try: | 
 | 1313 |             with support.temp_cwd(): | 
| Łukasz Langa | 2eb6eca | 2016-09-09 22:21:17 -0700 | [diff] [blame] | 1314 |                 with open('.pdbrc', 'w') as f: | 
 | 1315 |                     f.write("invalid\n") | 
 | 1316 |  | 
 | 1317 |                 with open('main.py', 'w') as f: | 
 | 1318 |                     f.write(script) | 
 | 1319 |  | 
 | 1320 |                 cmd = [sys.executable, 'main.py'] | 
 | 1321 |                 proc = subprocess.Popen( | 
 | 1322 |                     cmd, | 
 | 1323 |                     stdout=subprocess.PIPE, | 
 | 1324 |                     stdin=subprocess.PIPE, | 
 | 1325 |                     stderr=subprocess.PIPE, | 
 | 1326 |                 ) | 
| Victor Stinner | bc62626 | 2016-09-09 23:22:09 -0700 | [diff] [blame] | 1327 |                 with proc: | 
 | 1328 |                     stdout, stderr = proc.communicate(b'q\n') | 
 | 1329 |                     self.assertNotIn("NameError: name 'invalid' is not defined", | 
 | 1330 |                                   stdout.decode()) | 
| Łukasz Langa | 2eb6eca | 2016-09-09 22:21:17 -0700 | [diff] [blame] | 1331 |  | 
 | 1332 |         finally: | 
| Victor Stinner | 11ea044 | 2016-09-09 22:56:54 -0700 | [diff] [blame] | 1333 |             if save_home is not None: | 
 | 1334 |                 os.environ['HOME'] = save_home | 
| Łukasz Langa | 2eb6eca | 2016-09-09 22:21:17 -0700 | [diff] [blame] | 1335 |  | 
| Barry Warsaw | 35425d6 | 2017-09-22 12:29:42 -0400 | [diff] [blame] | 1336 |     def test_header(self): | 
 | 1337 |         stdout = StringIO() | 
 | 1338 |         header = 'Nobody expects... blah, blah, blah' | 
 | 1339 |         with ExitStack() as resources: | 
 | 1340 |             resources.enter_context(patch('sys.stdout', stdout)) | 
 | 1341 |             resources.enter_context(patch.object(pdb.Pdb, 'set_trace')) | 
 | 1342 |             pdb.set_trace(header=header) | 
 | 1343 |         self.assertEqual(stdout.getvalue(), header + '\n') | 
 | 1344 |  | 
| Mario Corchero | 9f1e5f1 | 2018-01-06 07:53:05 +0000 | [diff] [blame] | 1345 |     def test_run_module(self): | 
 | 1346 |         script = """print("SUCCESS")""" | 
 | 1347 |         commands = """ | 
 | 1348 |             continue | 
 | 1349 |             quit | 
 | 1350 |         """ | 
 | 1351 |         stdout, stderr = self.run_pdb_module(script, commands) | 
 | 1352 |         self.assertTrue(any("SUCCESS" in l for l in stdout.splitlines()), stdout) | 
 | 1353 |  | 
 | 1354 |     def test_module_is_run_as_main(self): | 
 | 1355 |         script = """ | 
 | 1356 |             if __name__ == '__main__': | 
 | 1357 |                 print("SUCCESS") | 
 | 1358 |         """ | 
 | 1359 |         commands = """ | 
 | 1360 |             continue | 
 | 1361 |             quit | 
 | 1362 |         """ | 
 | 1363 |         stdout, stderr = self.run_pdb_module(script, commands) | 
 | 1364 |         self.assertTrue(any("SUCCESS" in l for l in stdout.splitlines()), stdout) | 
 | 1365 |  | 
 | 1366 |     def test_breakpoint(self): | 
 | 1367 |         script = """ | 
 | 1368 |             if __name__ == '__main__': | 
 | 1369 |                 pass | 
 | 1370 |                 print("SUCCESS") | 
 | 1371 |                 pass | 
 | 1372 |         """ | 
 | 1373 |         commands = """ | 
 | 1374 |             b 3 | 
 | 1375 |             quit | 
 | 1376 |         """ | 
 | 1377 |         stdout, stderr = self.run_pdb_module(script, commands) | 
 | 1378 |         self.assertTrue(any("Breakpoint 1 at" in l for l in stdout.splitlines()), stdout) | 
 | 1379 |         self.assertTrue(all("SUCCESS" not in l for l in stdout.splitlines()), stdout) | 
 | 1380 |  | 
 | 1381 |     def test_run_pdb_with_pdb(self): | 
 | 1382 |         commands = """ | 
 | 1383 |             c | 
 | 1384 |             quit | 
 | 1385 |         """ | 
 | 1386 |         stdout, stderr = self._run_pdb(["-m", "pdb"], commands) | 
| Mario Corchero | fcf8b4c | 2018-01-28 04:58:47 +0000 | [diff] [blame] | 1387 |         self.assertIn( | 
 | 1388 |             pdb._usage, | 
 | 1389 |             stdout.replace('\r', '')  # remove \r for windows | 
 | 1390 |         ) | 
| Mario Corchero | 9f1e5f1 | 2018-01-06 07:53:05 +0000 | [diff] [blame] | 1391 |  | 
 | 1392 |     def test_module_without_a_main(self): | 
 | 1393 |         module_name = 't_main' | 
 | 1394 |         support.rmtree(module_name) | 
 | 1395 |         init_file = module_name + '/__init__.py' | 
 | 1396 |         os.mkdir(module_name) | 
 | 1397 |         with open(init_file, 'w') as f: | 
 | 1398 |             pass | 
 | 1399 |         self.addCleanup(support.rmtree, module_name) | 
 | 1400 |         stdout, stderr = self._run_pdb(['-m', module_name], "") | 
 | 1401 |         self.assertIn("ImportError: No module named t_main.__main__", | 
 | 1402 |                       stdout.splitlines()) | 
 | 1403 |  | 
 | 1404 |     def test_blocks_at_first_code_line(self): | 
 | 1405 |         script = """ | 
 | 1406 |                 #This is a comment, on line 2 | 
 | 1407 |  | 
 | 1408 |                 print("SUCCESS") | 
 | 1409 |         """ | 
 | 1410 |         commands = """ | 
 | 1411 |             quit | 
 | 1412 |         """ | 
 | 1413 |         stdout, stderr = self.run_pdb_module(script, commands) | 
 | 1414 |         self.assertTrue(any("__main__.py(4)<module>()" | 
 | 1415 |                             in l for l in stdout.splitlines()), stdout) | 
 | 1416 |  | 
 | 1417 |     def test_relative_imports(self): | 
 | 1418 |         self.module_name = 't_main' | 
 | 1419 |         support.rmtree(self.module_name) | 
 | 1420 |         main_file = self.module_name + '/__main__.py' | 
 | 1421 |         init_file = self.module_name + '/__init__.py' | 
 | 1422 |         module_file = self.module_name + '/module.py' | 
 | 1423 |         self.addCleanup(support.rmtree, self.module_name) | 
 | 1424 |         os.mkdir(self.module_name) | 
 | 1425 |         with open(init_file, 'w') as f: | 
 | 1426 |             f.write(textwrap.dedent(""" | 
 | 1427 |                 top_var = "VAR from top" | 
 | 1428 |             """)) | 
 | 1429 |         with open(main_file, 'w') as f: | 
 | 1430 |             f.write(textwrap.dedent(""" | 
 | 1431 |                 from . import top_var | 
 | 1432 |                 from .module import var | 
 | 1433 |                 from . import module | 
 | 1434 |                 pass # We'll stop here and print the vars | 
 | 1435 |             """)) | 
 | 1436 |         with open(module_file, 'w') as f: | 
 | 1437 |             f.write(textwrap.dedent(""" | 
 | 1438 |                 var = "VAR from module" | 
 | 1439 |                 var2 = "second var" | 
 | 1440 |             """)) | 
 | 1441 |         commands = """ | 
 | 1442 |             b 5 | 
 | 1443 |             c | 
 | 1444 |             p top_var | 
 | 1445 |             p var | 
 | 1446 |             p module.var2 | 
 | 1447 |             quit | 
 | 1448 |         """ | 
 | 1449 |         stdout, _ = self._run_pdb(['-m', self.module_name], commands) | 
 | 1450 |         self.assertTrue(any("VAR from module" in l for l in stdout.splitlines())) | 
 | 1451 |         self.assertTrue(any("VAR from top" in l for l in stdout.splitlines())) | 
 | 1452 |         self.assertTrue(any("second var" in l for l in stdout.splitlines())) | 
| Georg Brandl | 6cccb86 | 2010-07-30 14:16:43 +0000 | [diff] [blame] | 1453 |  | 
 | 1454 |  | 
| Andrew Svetlov | f0efea0 | 2013-03-18 10:09:50 -0700 | [diff] [blame] | 1455 | def load_tests(*args): | 
| Georg Brandl | 243ad66 | 2009-05-05 09:00:19 +0000 | [diff] [blame] | 1456 |     from test import test_pdb | 
| Mario Corchero | 9f1e5f1 | 2018-01-06 07:53:05 +0000 | [diff] [blame] | 1457 |     suites = [ | 
 | 1458 |         unittest.makeSuite(PdbTestCase), | 
 | 1459 |         doctest.DocTestSuite(test_pdb) | 
 | 1460 |     ] | 
| Andrew Svetlov | f0efea0 | 2013-03-18 10:09:50 -0700 | [diff] [blame] | 1461 |     return unittest.TestSuite(suites) | 
| Georg Brandl | 243ad66 | 2009-05-05 09:00:19 +0000 | [diff] [blame] | 1462 |  | 
 | 1463 |  | 
 | 1464 | if __name__ == '__main__': | 
| Andrew Svetlov | f0efea0 | 2013-03-18 10:09:50 -0700 | [diff] [blame] | 1465 |     unittest.main() |