| 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" |