59 lines
1.9 KiB
Python
59 lines
1.9 KiB
Python
"""Test cases for `--output=json`.
|
|
|
|
These cannot be run by the usual unit test runner because of the backslashes in
|
|
the output, which get normalized to forward slashes by the test suite on Windows.
|
|
"""
|
|
|
|
from __future__ import annotations
|
|
|
|
import os
|
|
import os.path
|
|
|
|
from mypy import api
|
|
from mypy.defaults import PYTHON3_VERSION
|
|
from mypy.test.config import test_temp_dir
|
|
from mypy.test.data import DataDrivenTestCase, DataSuite
|
|
|
|
|
|
class OutputJSONsuite(DataSuite):
|
|
files = ["outputjson.test"]
|
|
|
|
def run_case(self, testcase: DataDrivenTestCase) -> None:
|
|
test_output_json(testcase)
|
|
|
|
|
|
def test_output_json(testcase: DataDrivenTestCase) -> None:
|
|
"""Runs Mypy in a subprocess, and ensures that `--output=json` works as intended."""
|
|
mypy_cmdline = ["--output=json"]
|
|
mypy_cmdline.append(f"--python-version={'.'.join(map(str, PYTHON3_VERSION))}")
|
|
|
|
# Write the program to a file.
|
|
program_path = os.path.join(test_temp_dir, "main")
|
|
mypy_cmdline.append(program_path)
|
|
with open(program_path, "w", encoding="utf8") as file:
|
|
for s in testcase.input:
|
|
file.write(f"{s}\n")
|
|
|
|
output = []
|
|
# Type check the program.
|
|
out, err, returncode = api.run(mypy_cmdline)
|
|
# split lines, remove newlines, and remove directory of test case
|
|
for line in (out + err).rstrip("\n").splitlines():
|
|
if line.startswith(test_temp_dir + os.sep):
|
|
output.append(line[len(test_temp_dir + os.sep) :].rstrip("\r\n"))
|
|
else:
|
|
output.append(line.rstrip("\r\n"))
|
|
|
|
if returncode > 1:
|
|
output.append("!!! Mypy crashed !!!")
|
|
|
|
# Remove temp file.
|
|
os.remove(program_path)
|
|
|
|
# JSON encodes every `\` character into `\\`, so we need to remove `\\` from windows paths
|
|
# and `/` from POSIX paths
|
|
json_os_separator = os.sep.replace("\\", "\\\\")
|
|
normalized_output = [line.replace(test_temp_dir + json_os_separator, "") for line in output]
|
|
|
|
assert normalized_output == testcase.output
|