pdb: modernize find_function() and add tests for it.

Closes #18714.
This commit is contained in:
Georg Brandl 2013-10-13 20:51:47 +02:00
parent 7ff4520584
commit 6e22055ee1
3 changed files with 37 additions and 12 deletions

View File

@ -95,18 +95,11 @@ def find_function(funcname, filename):
except OSError:
return None
# consumer of this info expects the first line to be 1
lineno = 1
answer = None
while True:
line = fp.readline()
if line == '':
break
if cre.match(line):
answer = funcname, filename, lineno
break
lineno += 1
fp.close()
return answer
with fp:
for lineno, line in enumerate(fp, start=1):
if cre.match(line):
return funcname, filename, lineno
return None
def getsourcelines(obj):
lines, lineno = inspect.findsource(obj)

View File

@ -620,6 +620,36 @@ class PdbTestCase(unittest.TestCase):
stderr = stderr and bytes.decode(stderr)
return stdout, stderr
def _assert_find_function(self, file_content, func_name, expected):
file_content = textwrap.dedent(file_content)
with open(support.TESTFN, 'w') as f:
f.write(file_content)
expected = None if not expected else (
expected[0], support.TESTFN, expected[1])
self.assertEqual(
expected, pdb.find_function(func_name, support.TESTFN))
def test_find_function_empty_file(self):
self._assert_find_function('', 'foo', None)
def test_find_function_found(self):
self._assert_find_function(
"""\
def foo():
pass
def bar():
pass
def quux():
pass
""",
'bar',
('bar', 4),
)
def test_issue7964(self):
# open the file as binary so we can force \r\n newline
with open(support.TESTFN, 'wb') as f:

View File

@ -114,6 +114,8 @@ Tests
- Issue #18919: Unified and extended tests for audio modules: aifc, sunau and
wave.
- Issue #18714: Added tests for ``pdb.find_function()``.
Documentation
-------------