| 2305 | |
| 2306 | |
| 2307 | class _DocTestCaseRunner(DocTestRunner): |
| 2308 | |
| 2309 | def __init__(self, *args, test_case, test_result, **kwargs): |
| 2310 | super().__init__(*args, **kwargs) |
| 2311 | self._test_case = test_case |
| 2312 | self._test_result = test_result |
| 2313 | self._examplenum = 0 |
| 2314 | |
| 2315 | def _subTest(self): |
| 2316 | subtest = unittest.case._SubTest(self._test_case, str(self._examplenum), {}) |
| 2317 | self._examplenum += 1 |
| 2318 | return subtest |
| 2319 | |
| 2320 | def report_skip(self, out, test, example): |
| 2321 | unittest.case._addSkip(self._test_result, self._subTest(), '') |
| 2322 | |
| 2323 | def report_success(self, out, test, example, got): |
| 2324 | self._test_result.addSubTest(self._test_case, self._subTest(), None) |
| 2325 | |
| 2326 | def report_unexpected_exception(self, out, test, example, exc_info): |
| 2327 | tb = self._add_traceback(exc_info[2], test, example) |
| 2328 | exc_info = (*exc_info[:2], tb) |
| 2329 | self._test_result.addSubTest(self._test_case, self._subTest(), exc_info) |
| 2330 | |
| 2331 | def report_failure(self, out, test, example, got): |
| 2332 | msg = ('Failed example:\n' + _indent(example.source) + |
| 2333 | self._checker.output_difference(example, got, self.optionflags).rstrip('\n')) |
| 2334 | exc = self._test_case.failureException(msg) |
| 2335 | tb = self._add_traceback(None, test, example) |
| 2336 | exc_info = (type(exc), exc, tb) |
| 2337 | self._test_result.addSubTest(self._test_case, self._subTest(), exc_info) |
| 2338 | |
| 2339 | def _add_traceback(self, traceback, test, example): |
| 2340 | if test.lineno is None or example.lineno is None: |
| 2341 | lineno = None |
| 2342 | else: |
| 2343 | lineno = test.lineno + example.lineno + 1 |
| 2344 | return types.SimpleNamespace( |
| 2345 | tb_frame = types.SimpleNamespace( |
| 2346 | f_globals=test.globs, |
| 2347 | f_code=types.SimpleNamespace( |
| 2348 | co_filename=test.filename, |
| 2349 | co_name=test.name, |
| 2350 | ), |
| 2351 | ), |
| 2352 | tb_next = traceback, |
| 2353 | tb_lasti = -1, |
| 2354 | tb_lineno = lineno, |
| 2355 | ) |
| 2356 | |
| 2357 | |
| 2358 | class DocTestCase(unittest.TestCase): |