Change tests with stdin/out to exercise black.main (#307)

This commit is contained in:
Zsolt Dollenstein 2018-06-07 00:42:50 +02:00 committed by Łukasz Langa
parent 4ad7c9c107
commit 33baccd88e

View File

@ -9,7 +9,7 @@
import re import re
import sys import sys
from tempfile import TemporaryDirectory from tempfile import TemporaryDirectory
from typing import Any, List, Tuple, Iterator from typing import Any, BinaryIO, Generator, List, Tuple, Iterator
import unittest import unittest
from unittest.mock import patch from unittest.mock import patch
@ -78,6 +78,26 @@ def event_loop(close: bool) -> Iterator[None]:
loop.close() loop.close()
class BlackRunner(CliRunner):
"""Modify CliRunner so that stderr is not merged with stdout.
This is a hack that can be removed once we depend on Click 7.x"""
def __init__(self, stderrbuf: BinaryIO) -> None:
self.stderrbuf = stderrbuf
super().__init__()
@contextmanager
def isolation(self, *args: Any, **kwargs: Any) -> Generator[BinaryIO, None, None]:
with super().isolation(*args, **kwargs) as output:
try:
hold_stderr = sys.stderr
sys.stderr = TextIOWrapper(self.stderrbuf, encoding=self.charset)
yield output
finally:
sys.stderr = hold_stderr
class BlackTestCase(unittest.TestCase): class BlackTestCase(unittest.TestCase):
maxDiff = None maxDiff = None
@ -139,21 +159,14 @@ def test_black(self) -> None:
def test_piping(self) -> None: def test_piping(self) -> None:
source, expected = read_data("../black") source, expected = read_data("../black")
hold_stdin, hold_stdout = sys.stdin, sys.stdout stderrbuf = BytesIO()
try: result = BlackRunner(stderrbuf).invoke(
sys.stdin = TextIOWrapper(BytesIO(source.encode("utf8")), encoding="utf8") black.main, ["-", "--fast", f"--line-length={ll}"], input=source
sys.stdout = TextIOWrapper(BytesIO(), encoding="utf8") )
sys.stdin.buffer.name = "<stdin>" # type: ignore self.assertEqual(result.exit_code, 0)
black.format_stdin_to_stdout( self.assertFormatEqual(expected, result.output)
line_length=ll, fast=True, write_back=black.WriteBack.YES black.assert_equivalent(source, result.output)
) black.assert_stable(source, result.output, line_length=ll)
sys.stdout.seek(0)
actual = sys.stdout.read()
finally:
sys.stdin, sys.stdout = hold_stdin, hold_stdout
self.assertFormatEqual(expected, actual)
black.assert_equivalent(source, actual)
black.assert_stable(source, actual, line_length=ll)
def test_piping_diff(self) -> None: def test_piping_diff(self) -> None:
diff_header = re.compile( diff_header = re.compile(
@ -162,18 +175,12 @@ def test_piping_diff(self) -> None:
) )
source, _ = read_data("expression.py") source, _ = read_data("expression.py")
expected, _ = read_data("expression.diff") expected, _ = read_data("expression.diff")
hold_stdin, hold_stdout = sys.stdin, sys.stdout stderrbuf = BytesIO()
try: result = BlackRunner(stderrbuf).invoke(
sys.stdin = TextIOWrapper(BytesIO(source.encode("utf8")), encoding="utf8") black.main, ["-", "--fast", f"--line-length={ll}", "--diff"], input=source
sys.stdout = TextIOWrapper(BytesIO(), encoding="utf8") )
black.format_stdin_to_stdout( self.assertEqual(result.exit_code, 0)
line_length=ll, fast=True, write_back=black.WriteBack.DIFF actual = diff_header.sub("[Deterministic header]", result.output)
)
sys.stdout.seek(0)
actual = sys.stdout.read()
actual = diff_header.sub("[Deterministic header]", actual)
finally:
sys.stdin, sys.stdout = hold_stdin, hold_stdout
actual = actual.rstrip() + "\n" # the diff output has a trailing space actual = actual.rstrip() + "\n" # the diff output has a trailing space
self.assertEqual(expected, actual) self.assertEqual(expected, actual)
@ -232,16 +239,16 @@ def test_expression_diff(self) -> None:
rf"{re.escape(str(tmp_file))}\t\d\d\d\d-\d\d-\d\d " rf"{re.escape(str(tmp_file))}\t\d\d\d\d-\d\d-\d\d "
rf"\d\d:\d\d:\d\d\.\d\d\d\d\d\d \+\d\d\d\d" rf"\d\d:\d\d:\d\d\.\d\d\d\d\d\d \+\d\d\d\d"
) )
hold_stdout = sys.stdout stderrbuf = BytesIO()
try: try:
sys.stdout = TextIOWrapper(BytesIO(), encoding="utf8") result = BlackRunner(stderrbuf).invoke(
self.assertTrue(ff(tmp_file, write_back=black.WriteBack.DIFF)) black.main, ["--diff", str(tmp_file)]
sys.stdout.seek(0) )
actual = sys.stdout.read() self.assertEqual(result.exit_code, 0)
actual = diff_header.sub("[Deterministic header]", actual)
finally: finally:
sys.stdout = hold_stdout
os.unlink(tmp_file) os.unlink(tmp_file)
actual = result.output
actual = diff_header.sub("[Deterministic header]", actual)
actual = actual.rstrip() + "\n" # the diff output has a trailing space actual = actual.rstrip() + "\n" # the diff output has a trailing space
if expected != actual: if expected != actual:
dump = black.dump_to_file(actual) dump = black.dump_to_file(actual)
@ -1150,6 +1157,10 @@ def test_preserves_line_endings(self) -> None:
if nl == "\n": if nl == "\n":
self.assertNotIn(b"\r\n", updated_contents) # type: ignore self.assertNotIn(b"\r\n", updated_contents) # type: ignore
def test_assert_equivalent_different_asts(self) -> None:
with self.assertRaises(AssertionError):
black.assert_equivalent("{}", "None")
if __name__ == "__main__": if __name__ == "__main__":
unittest.main() unittest.main()