"""Tests for the line-based transformers in IPython.core.inputtransformer2

Line-based transformers are the simpler ones; token-based transformers are
more complex. See test_inputtransformer2 for tests for token-based transformers.
"""

import pytest

from IPython.core import inputtransformer2 as ipt2

CELL_MAGIC = (
    """\
%%foo arg
body 1
body 2
""",
    """\
get_ipython().run_cell_magic('foo', 'arg', 'body 1\\nbody 2\\n')
""",
)


def test_cell_magic():
    for sample, expected in [CELL_MAGIC]:
        assert ipt2.cell_magic(sample.splitlines(keepends=True)) == expected.splitlines(
            keepends=True
        )


CLASSIC_PROMPT = (
    """\
>>> for a in range(5):
...     print(a)
""",
    """\
for a in range(5):
    print(a)
""",
)

CLASSIC_PROMPT_L2 = (
    """\
for a in range(5):
...     print(a)
...     print(a ** 2)
""",
    """\
for a in range(5):
...     print(a)
...     print(a ** 2)
""",
)

CLASSIC_PROMPT_L3 = (
    """\
>>> \"\"\"
... This code is inside a triple-quoted string.
... >>> for a in range(5):
... ...     print(a)
... \"\"\"
>>> for a in range(5):
...     print(a)
""",
    """\
>>> \"\"\"
... This code is inside a triple-quoted string.
... >>> for a in range(5):
... ...     print(a)
... \"\"\"
for a in range(5):
    print(a)
""",
)

CLASSIC_PROMPT_DEDENT_SINGLE_LINE = (
    ">>>     print(1)\n",
    "print(1)\n",
)

CLASSIC_PROMPT_DEDENT_LEADING_WS = (
    "    >>>     print(1)\n",
    "print(1)\n",
)

CLASSIC_PROMPT_MULTILINE_DOCTEST = (
    """\
>>> for i in range(2):
...     print(i)
""",
    """\
for i in range(2):
    print(i)
""",
)

CLASSIC_PROMPT_STANDALONE_CONTINUATION = (
    "...     print(1)\n",
    "...     print(1)\n",
)


def test_classic_prompt():
    for sample, expected in [
        CLASSIC_PROMPT,
        CLASSIC_PROMPT_L2,
        CLASSIC_PROMPT_L3,
        CLASSIC_PROMPT_DEDENT_SINGLE_LINE,
        CLASSIC_PROMPT_DEDENT_LEADING_WS,
        CLASSIC_PROMPT_MULTILINE_DOCTEST,
        CLASSIC_PROMPT_STANDALONE_CONTINUATION,
    ]:
        assert ipt2.classic_prompt(
            sample.splitlines(keepends=True)
        ) == expected.splitlines(keepends=True)


IPYTHON_PROMPT = (
    """\
In [1]: for a in range(5):
   ...:     print(a)
""",
    """\
for a in range(5):
    print(a)
""",
)

IPYTHON_PROMPT_L2 = (
    """\
for a in range(5):
   ...:     print(a)
   ...:     print(a ** 2)
""",
    """\
for a in range(5):
    print(a)
    print(a ** 2)
""",
)


IPYTHON_PROMPT_VI_INS = (
    """\
[ins] In [11]: def a():
          ...:     123
          ...:
          ...: 123
""",
    """\
def a():
    123

123
""",
)

IPYTHON_PROMPT_VI_NAV = (
    """\
[nav] In [11]: def a():
          ...:     123
          ...:
          ...: 123
""",
    """\
def a():
    123

123
""",
)


def test_ipython_prompt():
    for sample, expected in [
        IPYTHON_PROMPT,
        IPYTHON_PROMPT_L2,
        IPYTHON_PROMPT_VI_INS,
        IPYTHON_PROMPT_VI_NAV,
    ]:
        assert ipt2.ipython_prompt(
            sample.splitlines(keepends=True)
        ) == expected.splitlines(keepends=True)


INDENT_SPACES = (
    """\
     if True:
        a = 3
""",
    """\
if True:
   a = 3
""",
)

INDENT_TABS = (
    """\
\tif True:
\t\tb = 4
""",
    """\
if True:
\tb = 4
""",
)


def test_leading_indent():
    for sample, expected in [INDENT_SPACES, INDENT_TABS]:
        assert ipt2.leading_indent(
            sample.splitlines(keepends=True)
        ) == expected.splitlines(keepends=True)


INDENT_SPACES_COMMENT = (
    """\
    # comment
if True:
    a = 3
""",
    """\
    # comment
if True:
    a = 3
""",
)

INDENT_TABS_COMMENT = (
    """\
\t# comment
if True:
\tb = 4
""",
    """\
\t# comment
if True:
\tb = 4
""",
)


INDENTED_CODE_WITH_ALIGNED_COMMENT = (
    """\
    # comment
    x = 1
    print(x)
""",
    """\
# comment
x = 1
print(x)
""",
)


@pytest.mark.parametrize(
    "sample, expected",
    [INDENT_SPACES_COMMENT, INDENT_TABS_COMMENT, INDENTED_CODE_WITH_ALIGNED_COMMENT],
)
def test_leading_indent_comment(sample, expected):
    assert ipt2.leading_indent(sample.splitlines(keepends=True)) == expected.splitlines(
        keepends=True
    )


LEADING_EMPTY_LINES = (
    """\
    \t

if True:
    a = 3

b = 4
""",
    """\
if True:
    a = 3

b = 4
""",
)

ONLY_EMPTY_LINES = (
    """\
    \t

""",
    """\
    \t

""",
)


def test_leading_empty_lines():
    for sample, expected in [LEADING_EMPTY_LINES, ONLY_EMPTY_LINES]:
        assert ipt2.leading_empty_lines(
            sample.splitlines(keepends=True)
        ) == expected.splitlines(keepends=True)


CRLF_MAGIC = (["%%ls\r\n"], ["get_ipython().run_cell_magic('ls', '', '')\n"])


def test_crlf_magic():
    for sample, expected in [CRLF_MAGIC]:
        assert ipt2.cell_magic(sample) == expected
