# coding: utf-8

# there is some work to do
# provide a failing test xyz and a non-failing xyz_no_fail ( to see
# what the current failing output is.
# on fix of ruamel.yaml, move the marked test to the appropriate test (without mark)
# and remove remove the xyz_no_fail

import pytest  # type: ignore

from roundtrip import round_trip, dedent, round_trip_load, round_trip_dump  # type: ignore


class TestCommentFailures:
    @pytest.mark.xfail(strict=True)  # type: ignore
    def test_set_comment_before_tag(self) -> None:
        # no comments before tags
        round_trip("""
        # the beginning
        !!set
        # or this one?
        ? a
        # next one is B (lowercase)
        ? b  #  You see? Promised you.
        ? c
        # this is the end
        """)

    def test_set_comment_before_tag_no_fail(self) -> None:
        # no comments before tags
        inp = """
        # the beginning
        !!set
        # or this one?
        ? a
        # next one is B (lowercase)
        ? b  #  You see? Promised you.
        ? c
        # this is the end
        """
        assert round_trip_dump(round_trip_load(inp)) == dedent("""
        !!set
        # or this one?
        ? a
        # next one is B (lowercase)
        ? b  #  You see? Promised you.
        ? c
        # this is the end
        """)

    @pytest.mark.xfail(strict=True)  # type: ignore
    def test_comment_dash_line(self) -> None:
        round_trip("""
        - # abc
           a: 1
           b: 2
        """)

    def test_comment_dash_line_fail(self) -> None:
        x = """
        - # abc
           a: 1
           b: 2
        """
        data = round_trip_load(x)
        # this is not nice
        assert round_trip_dump(data) == dedent("""
          # abc
        - a: 1
          b: 2
        """)


class TestIndentFailures:
    @pytest.mark.xfail(strict=True)  # type: ignore
    def test_indent_not_retained(self) -> None:
        round_trip("""
        verbosity: 1                  # 0 is minimal output, -1 none
        base_url: http://gopher.net
        special_indices: [1, 5, 8]
        also_special:
        - a
        - 19
        - 32
        asia and europe: &asia_europe
            Turkey: Ankara
            Russia: Moscow
        countries:
            Asia:
                <<: *asia_europe
                Japan: Tokyo # 東京
            Europe:
                <<: *asia_europe
                Spain: Madrid
                Italy: Rome
            Antarctica:
            -   too cold
        """)

    def test_indent_not_retained_no_fail(self) -> None:
        inp = """
        verbosity: 1                  # 0 is minimal output, -1 none
        base_url: http://gopher.net
        special_indices: [1, 5, 8]
        also_special:
        - a
        - 19
        - 32
        asia and europe: &asia_europe
            Turkey: Ankara
            Russia: Moscow
        countries:
            Asia:
                <<: *asia_europe
                Japan: Tokyo # 東京
            Europe:
                <<: *asia_europe
                Spain: Madrid
                Italy: Rome
            Antarctica:
            -   too cold
        """
        assert round_trip_dump(round_trip_load(inp), indent=4) == dedent("""
        verbosity: 1                  # 0 is minimal output, -1 none
        base_url: http://gopher.net
        special_indices: [1, 5, 8]
        also_special:
        -   a
        -   19
        -   32
        asia and europe: &asia_europe
            Turkey: Ankara
            Russia: Moscow
        countries:
            Asia:
                <<: *asia_europe
                Japan: Tokyo # 東京
            Europe:
                <<: *asia_europe
                Spain: Madrid
                Italy: Rome
            Antarctica:
            -   too cold
        """)

    def Xtest_indent_top_level_no_fail(self) -> None:
        inp = """
        -   a:
            - b
        """
        round_trip(inp, indent=4)


class TestTagFailures:
    @pytest.mark.xfail(strict=True)  # type: ignore
    def test_standard_short_tag(self) -> None:
        round_trip("""\
        !!map
        name: Anthon
        location: Germany
        language: python
        """)

    def test_standard_short_tag_no_fail(self) -> None:
        inp = """
        !!map
        name: Anthon
        location: Germany
        language: python
        """
        exp = """
        name: Anthon
        location: Germany
        language: python
        """
        assert round_trip_dump(round_trip_load(inp)) == dedent(exp)


class TestFlowValues:
    def test_flow_value_with_colon(self) -> None:
        inp = """\
        {a: bcd:efg}
        """
        round_trip(inp)

    def test_flow_value_with_colon_quoted(self) -> None:
        inp = """\
        {a: 'bcd:efg'}
        """
        round_trip(inp, preserve_quotes=True)


class TestMappingKey:
    def test_simple_mapping_key(self) -> None:
        inp = """\
        {a: 1, b: 2}: hello world
        """
        round_trip(inp, preserve_quotes=True, dump_data=False)

    def test_set_simple_mapping_key(self) -> None:
        from ruamel.yaml.comments import CommentedKeyMap

        d = {CommentedKeyMap([('a', 1), ('b', 2)]): 'hello world'}
        exp = dedent("""\
        {a: 1, b: 2}: hello world
        """)
        assert round_trip_dump(d) == exp

    def test_change_key_simple_mapping_key(self) -> None:
        from ruamel.yaml.comments import CommentedKeyMap

        inp = """\
        {a: 1, b: 2}: hello world
        """
        d = round_trip_load(inp, preserve_quotes=True)
        d[CommentedKeyMap([('b', 1), ('a', 2)])] = d.pop(CommentedKeyMap([('a', 1), ('b', 2)]))
        exp = dedent("""\
        {b: 1, a: 2}: hello world
        """)
        assert round_trip_dump(d) == exp

    def test_change_value_simple_mapping_key(self) -> None:
        from ruamel.yaml.comments import CommentedKeyMap

        inp = """\
        {a: 1, b: 2}: hello world
        """
        d = round_trip_load(inp, preserve_quotes=True)
        d = {CommentedKeyMap([('a', 1), ('b', 2)]): 'goodbye'}
        exp = dedent("""\
        {a: 1, b: 2}: goodbye
        """)
        assert round_trip_dump(d) == exp
