104 lines
2.7 KiB
Python
104 lines
2.7 KiB
Python
|
"""
|
||
|
A "meta test" which tests the parsing of .test files. This is not meant to become exhaustive
|
||
|
but to ensure we maintain a basic level of ergonomics for mypy contributors.
|
||
|
"""
|
||
|
import subprocess
|
||
|
import sys
|
||
|
import textwrap
|
||
|
import uuid
|
||
|
from pathlib import Path
|
||
|
|
||
|
from mypy.test.config import test_data_prefix
|
||
|
from mypy.test.helpers import Suite
|
||
|
|
||
|
|
||
|
class ParseTestDataSuite(Suite):
|
||
|
def _dedent(self, s: str) -> str:
|
||
|
return textwrap.dedent(s).lstrip()
|
||
|
|
||
|
def _run_pytest(self, data_suite: str) -> str:
|
||
|
p_test_data = Path(test_data_prefix)
|
||
|
p_root = p_test_data.parent.parent
|
||
|
p = p_test_data / f"check-meta-{uuid.uuid4()}.test"
|
||
|
assert not p.exists()
|
||
|
try:
|
||
|
p.write_text(data_suite)
|
||
|
test_nodeid = f"mypy/test/testcheck.py::TypeCheckSuite::{p.name}"
|
||
|
args = [sys.executable, "-m", "pytest", "-n", "0", "-s", test_nodeid]
|
||
|
proc = subprocess.run(args, cwd=p_root, capture_output=True, check=False)
|
||
|
return proc.stdout.decode()
|
||
|
finally:
|
||
|
p.unlink()
|
||
|
|
||
|
def test_parse_invalid_case(self) -> None:
|
||
|
# Arrange
|
||
|
data = self._dedent(
|
||
|
"""
|
||
|
[case abc]
|
||
|
s: str
|
||
|
[case foo-XFAIL]
|
||
|
s: str
|
||
|
"""
|
||
|
)
|
||
|
|
||
|
# Act
|
||
|
actual = self._run_pytest(data)
|
||
|
|
||
|
# Assert
|
||
|
assert "Invalid testcase id 'foo-XFAIL'" in actual
|
||
|
|
||
|
def test_parse_invalid_section(self) -> None:
|
||
|
# Arrange
|
||
|
data = self._dedent(
|
||
|
"""
|
||
|
[case abc]
|
||
|
s: str
|
||
|
[unknownsection]
|
||
|
abc
|
||
|
"""
|
||
|
)
|
||
|
|
||
|
# Act
|
||
|
actual = self._run_pytest(data)
|
||
|
|
||
|
# Assert
|
||
|
expected_lineno = data.splitlines().index("[unknownsection]") + 1
|
||
|
expected = (
|
||
|
f".test:{expected_lineno}: Invalid section header [unknownsection] in case 'abc'"
|
||
|
)
|
||
|
assert expected in actual
|
||
|
|
||
|
def test_bad_ge_version_check(self) -> None:
|
||
|
# Arrange
|
||
|
data = self._dedent(
|
||
|
"""
|
||
|
[case abc]
|
||
|
s: str
|
||
|
[out version>=3.8]
|
||
|
abc
|
||
|
"""
|
||
|
)
|
||
|
|
||
|
# Act
|
||
|
actual = self._run_pytest(data)
|
||
|
|
||
|
# Assert
|
||
|
assert "version>=3.8 always true since minimum runtime version is (3, 8)" in actual
|
||
|
|
||
|
def test_bad_eq_version_check(self) -> None:
|
||
|
# Arrange
|
||
|
data = self._dedent(
|
||
|
"""
|
||
|
[case abc]
|
||
|
s: str
|
||
|
[out version==3.7]
|
||
|
abc
|
||
|
"""
|
||
|
)
|
||
|
|
||
|
# Act
|
||
|
actual = self._run_pytest(data)
|
||
|
|
||
|
# Assert
|
||
|
assert "version==3.7 always false since minimum runtime version is (3, 8)" in actual
|