import pytest
from src.parser.json_parser import JsonParser


class TestJsonParser():

    def test_parse(self) -> dict:
        """
        Cases:
            - コメントアウトが記載されているJSONからコメントを取り除き、辞書型を返すこと
        Arranges:
            - JSON文字列を準備する
        Expects:
            - json.loadsされたファイルの内容が期待値と一致する
        """

        # Arranges
        json_string = """{
            "aaaa": "aaaa",
            # これはコメントです
            "#これはコメントではありません": "#これはコメントではありません",
            "bbb": false,
            "hogehoge": [
                "ccc",
                /これはコメントです
                "/これはコメントではありません"
            ]
        }"""

        # Act
        sut = JsonParser(json_string)
        actual = sut.parse()

        # Expects
        expected_value = {
            "aaaa": "aaaa",
            "#これはコメントではありません": "#これはコメントではありません",
            "bbb": False,
            "hogehoge": [
                "ccc",
                "/これはコメントではありません"
            ]
        }

        assert actual == expected_value

    def test_raise_parse(self) -> dict:
        """
        Cases:
            - コメントアウト記号ではない文字をコメントアウトとしたときに、例外が発生すること
        Arranges:
            - JSON文字列を準備する
        Expects:
            - 例外が発生し期待値と一致する
        """

        # Arranges
        json_string = """{
            "aaaa": "aaaa",
            $ これはコメントです
            "#これはコメントではありません": "#これはコメントではありません",
            "bbb": false,
            "hogehoge": [
                "ccc",
                /これはコメントです
                "/これはコメントではありません"
            ]
        }"""

        # Act
        with pytest.raises(Exception) as e:

            sut = JsonParser(json_string)
            sut.parse()

        # Expects
        assert "Expecting property name enclosed in double quotes:" in str(e.value)
