| from __future__ import annotations | |
| import textwrap | |
| import pytest | |
| from pre_commit_hooks.string_fixer import main | |
| TESTS = ( | |
| # Base cases | |
| ("''", "''", 0), | |
| ('""', "''", 1), | |
| (r'"\'"', r'"\'"', 0), | |
| (r'"\""', r'"\""', 0), | |
| (r"'\"\"'", r"'\"\"'", 0), | |
| # String somewhere in the line | |
| ('x = "foo"', "x = 'foo'", 1), | |
| # Test escaped characters | |
| (r'"\'"', r'"\'"', 0), | |
| # Docstring | |
| ('""" Foo """', '""" Foo """', 0), | |
| ( | |
| textwrap.dedent( | |
| """ | |
| x = " \\ | |
| foo \\ | |
| "\n | |
| """, | |
| ), | |
| textwrap.dedent( | |
| """ | |
| x = ' \\ | |
| foo \\ | |
| '\n | |
| """, | |
| ), | |
| 1, | |
| ), | |
| ('"foo""bar"', "'foo''bar'", 1), | |
| pytest.param( | |
| "f'hello{\"world\"}'", | |
| "f'hello{\"world\"}'", | |
| 0, | |
| id='ignore nested fstrings', | |
| ), | |
| ) | |
| @pytest.mark.parametrize(('input_s', 'output', 'expected_retval'), TESTS) | |
| def test_rewrite(input_s, output, expected_retval, tmpdir): | |
| path = tmpdir.join('file.py') | |
| path.write(input_s) | |
| retval = main([str(path)]) | |
| assert path.read() == output | |
| assert retval == expected_retval | |
| def test_rewrite_crlf(tmpdir): | |
| f = tmpdir.join('f.py') | |
| f.write_binary(b'"foo"\r\n"bar"\r\n') | |
| assert main((str(f),)) | |
| assert f.read_binary() == b"'foo'\r\n'bar'\r\n" |