blob: 7851ca3f510f154f2a665d1c49c47ee9aba132f0 [file] [log] [blame]
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()