X-Git-Url: https://git.madduck.net/etc/vim.git/blobdiff_plain/e74117f172e29e8a980e2c9de929ad50d3769150..70a9e5618a00968879c7d843a975eaadb9cc3023:/tests/test_black.py diff --git a/tests/test_black.py b/tests/test_black.py index d9c0c5e..62b4b1a 100644 --- a/tests/test_black.py +++ b/tests/test_black.py @@ -1,7 +1,10 @@ #!/usr/bin/env python3 from functools import partial +from io import StringIO +import os from pathlib import Path -from typing import List, Tuple +import sys +from typing import Any, List, Tuple import unittest from unittest.mock import patch @@ -10,7 +13,7 @@ from click import unstyle import black ll = 88 -ff = partial(black.format_file, line_length=ll, fast=True) +ff = partial(black.format_file_in_place, line_length=ll, fast=True) fs = partial(black.format_str, line_length=ll) THIS_FILE = Path(__file__) THIS_DIR = THIS_FILE.parent @@ -22,7 +25,7 @@ def dump_to_stderr(*output: str) -> str: def read_data(name: str) -> Tuple[str, str]: """read_data('test_name') -> 'input', 'output'""" - if not name.endswith('.py'): + if not name.endswith(('.py', '.out')): name += '.py' _input: List[str] = [] _output: List[str] = [] @@ -45,7 +48,8 @@ class BlackTestCase(unittest.TestCase): maxDiff = None def assertFormatEqual(self, expected: str, actual: str) -> None: - if actual != expected: + if actual != expected and not os.environ.get('SKIP_AST_PRINT'): + bdv: black.DebugVisitor[Any] black.out('Expected tree:', fg='green') try: exp_node = black.lib2to3_parse(expected) @@ -69,8 +73,7 @@ class BlackTestCase(unittest.TestCase): self.assertFormatEqual(expected, actual) black.assert_equivalent(source, actual) black.assert_stable(source, actual, line_length=ll) - with self.assertRaises(black.NothingChanged): - ff(THIS_FILE) + self.assertFalse(ff(THIS_FILE)) @patch("black.dump_to_file", dump_to_stderr) def test_black(self) -> None: @@ -79,8 +82,22 @@ class BlackTestCase(unittest.TestCase): self.assertFormatEqual(expected, actual) black.assert_equivalent(source, actual) black.assert_stable(source, actual, line_length=ll) - with self.assertRaises(black.NothingChanged): - ff(THIS_FILE) + self.assertFalse(ff(THIS_DIR / '..' / 'black.py')) + + def test_piping(self) -> None: + source, expected = read_data('../black') + hold_stdin, hold_stdout = sys.stdin, sys.stdout + try: + sys.stdin, sys.stdout = StringIO(source), StringIO() + sys.stdin.name = '' + black.format_stdin_to_stdout(line_length=ll, fast=True, write_back=True) + 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) @patch("black.dump_to_file", dump_to_stderr) def test_setup(self) -> None: @@ -89,8 +106,7 @@ class BlackTestCase(unittest.TestCase): self.assertFormatEqual(expected, actual) black.assert_equivalent(source, actual) black.assert_stable(source, actual, line_length=ll) - with self.assertRaises(black.NothingChanged): - ff(THIS_FILE) + self.assertFalse(ff(THIS_DIR / '..' / 'setup.py')) @patch("black.dump_to_file", dump_to_stderr) def test_function(self) -> None: @@ -108,6 +124,14 @@ class BlackTestCase(unittest.TestCase): black.assert_equivalent(source, actual) black.assert_stable(source, actual, line_length=ll) + @patch("black.dump_to_file", dump_to_stderr) + def test_fstring(self) -> None: + source, expected = read_data('fstring') + actual = fs(source) + self.assertFormatEqual(expected, actual) + black.assert_equivalent(source, actual) + black.assert_stable(source, actual, line_length=ll) + @patch("black.dump_to_file", dump_to_stderr) def test_comments(self) -> None: source, expected = read_data('comments') @@ -148,42 +172,69 @@ class BlackTestCase(unittest.TestCase): black.assert_equivalent(source, actual) black.assert_stable(source, actual, line_length=ll) + @patch("black.dump_to_file", dump_to_stderr) + def test_empty_lines(self) -> None: + source, expected = read_data('empty_lines') + actual = fs(source) + self.assertFormatEqual(expected, actual) + black.assert_equivalent(source, actual) + black.assert_stable(source, actual, line_length=ll) + + @patch("black.dump_to_file", dump_to_stderr) + def test_python2(self) -> None: + source, expected = read_data('python2') + actual = fs(source) + self.assertFormatEqual(expected, actual) + # black.assert_equivalent(source, actual) + black.assert_stable(source, actual, line_length=ll) + + @patch("black.dump_to_file", dump_to_stderr) + def test_fmtonoff(self) -> None: + source, expected = read_data('fmtonoff') + actual = fs(source) + self.assertFormatEqual(expected, actual) + black.assert_equivalent(source, actual) + black.assert_stable(source, actual, line_length=ll) + def test_report(self) -> None: report = black.Report() out_lines = [] err_lines = [] - def out(msg: str, **kwargs): + def out(msg: str, **kwargs: Any) -> None: out_lines.append(msg) - def err(msg: str, **kwargs): + def err(msg: str, **kwargs: Any) -> None: err_lines.append(msg) with patch("black.out", out), patch("black.err", err): - report.done(Path('f1'), changed=True) + report.done(Path('f1'), changed=False) self.assertEqual(len(out_lines), 1) self.assertEqual(len(err_lines), 0) - self.assertEqual(out_lines[-1], 'reformatted f1') - self.assertEqual(unstyle(str(report)), '1 file reformatted.') + self.assertEqual(out_lines[-1], 'f1 already well formatted, good job.') + self.assertEqual(unstyle(str(report)), '1 file left unchanged.') self.assertEqual(report.return_code, 0) - report.failed(Path('e1'), 'boom') - self.assertEqual(len(out_lines), 1) - self.assertEqual(len(err_lines), 1) - self.assertEqual(err_lines[-1], 'error: cannot format e1: boom') + report.done(Path('f2'), changed=True) + self.assertEqual(len(out_lines), 2) + self.assertEqual(len(err_lines), 0) + self.assertEqual(out_lines[-1], 'reformatted f2') self.assertEqual( - unstyle(str(report)), '1 file reformatted, 1 file failed to reformat.' + unstyle(str(report)), '1 file reformatted, 1 file left unchanged.' ) + self.assertEqual(report.return_code, 0) + report.check = True self.assertEqual(report.return_code, 1) - report.done(Path('f2'), changed=False) + report.check = False + report.failed(Path('e1'), 'boom') self.assertEqual(len(out_lines), 2) self.assertEqual(len(err_lines), 1) - self.assertEqual(out_lines[-1], 'f2 already well formatted, good job.') + self.assertEqual(err_lines[-1], 'error: cannot format e1: boom') self.assertEqual( unstyle(str(report)), '1 file reformatted, 1 file left unchanged, ' '1 file failed to reformat.', ) - self.assertEqual(report.return_code, 1) + self.assertEqual(report.return_code, 123) report.done(Path('f3'), changed=True) self.assertEqual(len(out_lines), 3) self.assertEqual(len(err_lines), 1) @@ -193,7 +244,7 @@ class BlackTestCase(unittest.TestCase): '2 files reformatted, 1 file left unchanged, ' '1 file failed to reformat.', ) - self.assertEqual(report.return_code, 1) + self.assertEqual(report.return_code, 123) report.failed(Path('e2'), 'boom') self.assertEqual(len(out_lines), 3) self.assertEqual(len(err_lines), 2) @@ -203,7 +254,7 @@ class BlackTestCase(unittest.TestCase): '2 files reformatted, 1 file left unchanged, ' '2 files failed to reformat.', ) - self.assertEqual(report.return_code, 1) + self.assertEqual(report.return_code, 123) report.done(Path('f4'), changed=False) self.assertEqual(len(out_lines), 4) self.assertEqual(len(err_lines), 2) @@ -213,7 +264,55 @@ class BlackTestCase(unittest.TestCase): '2 files reformatted, 2 files left unchanged, ' '2 files failed to reformat.', ) - self.assertEqual(report.return_code, 1) + self.assertEqual(report.return_code, 123) + report.check = True + self.assertEqual( + unstyle(str(report)), + '2 files would be reformatted, 2 files would be left unchanged, ' + '2 files would fail to reformat.', + ) + + def test_is_python36(self) -> None: + node = black.lib2to3_parse("def f(*, arg): ...\n") + self.assertFalse(black.is_python36(node)) + node = black.lib2to3_parse("def f(*, arg,): ...\n") + self.assertTrue(black.is_python36(node)) + node = black.lib2to3_parse("def f(*, arg): f'string'\n") + self.assertTrue(black.is_python36(node)) + source, expected = read_data('function') + node = black.lib2to3_parse(source) + self.assertTrue(black.is_python36(node)) + node = black.lib2to3_parse(expected) + self.assertTrue(black.is_python36(node)) + source, expected = read_data('expression') + node = black.lib2to3_parse(source) + self.assertFalse(black.is_python36(node)) + node = black.lib2to3_parse(expected) + self.assertFalse(black.is_python36(node)) + + def test_debug_visitor(self) -> None: + source, _ = read_data('debug_visitor.py') + expected, _ = read_data('debug_visitor.out') + out_lines = [] + err_lines = [] + + def out(msg: str, **kwargs: Any) -> None: + out_lines.append(msg) + + def err(msg: str, **kwargs: Any) -> None: + err_lines.append(msg) + + with patch("black.out", out), patch("black.err", err): + black.DebugVisitor.show(source) + actual = '\n'.join(out_lines) + '\n' + log_name = '' + if expected != actual: + log_name = black.dump_to_file(*out_lines) + self.assertEqual( + expected, + actual, + f"AST print out is different. Actual version dumped to {log_name}", + ) if __name__ == '__main__':