| import itertools |
| import re |
| import shlex |
| import unittest |
| from typing import List, Optional |
| |
| from tools.stats import test_history |
| from typing_extensions import TypedDict |
| |
| |
| class Example(TypedDict): |
| cmd: str |
| args: List[str] |
| lines: List[str] |
| |
| |
| def parse_block(block: List[str]) -> Optional[Example]: |
| if block: |
| match = re.match(r'^\$ ([^ ]+) (.*)$', block[0]) |
| if match: |
| cmd, first = match.groups() |
| args = [] |
| for i, line in enumerate([first] + block[1:]): |
| if line.endswith('\\'): |
| args.append(line[:-1]) |
| else: |
| args.append(line) |
| break |
| return { |
| 'cmd': cmd, |
| 'args': shlex.split(''.join(args)), |
| 'lines': block[i + 1:] |
| } |
| return None |
| |
| |
| def parse_description(description: str) -> List[Example]: |
| examples: List[Example] = [] |
| for block in description.split('\n\n'): |
| matches = [ |
| re.match(r'^ (.*)$', line) |
| for line in block.splitlines() |
| ] |
| if all(matches): |
| lines = [] |
| for match in matches: |
| assert match |
| line, = match.groups() |
| lines.append(line) |
| example = parse_block(lines) |
| if example: |
| examples.append(example) |
| return examples |
| |
| |
| @unittest.skip("Skipping as this test is fragile, issue #73083") |
| class TestTestHistory(unittest.TestCase): |
| maxDiff = None |
| |
| def test_help_examples(self) -> None: |
| examples = parse_description(test_history.description()) |
| self.assertEqual(len(examples), 3) |
| for i, example in enumerate(examples): |
| with self.subTest(i=i): |
| self.assertTrue(test_history.__file__.endswith(example['cmd'])) |
| expected = example['lines'] |
| actual = list(itertools.islice( |
| test_history.run(example['args']), |
| len(expected), |
| )) |
| self.assertEqual(actual, expected) |
| |
| |
| if __name__ == '__main__': |
| unittest.main() |