import pickle

from isort import exceptions


class TestISortError:
    def setup_class(self) -> None:
        self.instance = exceptions.ISortError()

    def test_init(self) -> None:
        assert isinstance(self.instance, exceptions.ISortError)

    def test_pickleable(self) -> None:
        assert isinstance(pickle.loads(pickle.dumps(self.instance)), exceptions.ISortError)


class TestExistingSyntaxErrors(TestISortError):
    def setup_class(self) -> None:
        self.instance: exceptions.ExistingSyntaxErrors = exceptions.ExistingSyntaxErrors(
            "file_path"
        )

    def test_variables(self) -> None:
        assert self.instance.file_path == "file_path"


class TestIntroducedSyntaxErrors(TestISortError):
    def setup_class(self) -> None:
        self.instance: exceptions.IntroducedSyntaxErrors = exceptions.IntroducedSyntaxErrors(
            "file_path"
        )

    def test_variables(self) -> None:
        assert self.instance.file_path == "file_path"


class TestFileSkipped(TestISortError):
    def setup_class(self) -> None:
        self.instance: exceptions.FileSkipped = exceptions.FileSkipped("message", "file_path")

    def test_variables(self) -> None:
        assert self.instance.file_path == "file_path"
        assert str(self.instance) == "message"


class TestFileSkipComment(TestISortError):
    def setup_class(self) -> None:
        self.instance: exceptions.FileSkipComment = exceptions.FileSkipComment("file_path")

    def test_variables(self) -> None:
        assert self.instance.file_path == "file_path"


class TestFileSkipSetting(TestISortError):
    def setup_class(self) -> None:
        self.instance: exceptions.FileSkipSetting = exceptions.FileSkipSetting("file_path")

    def test_variables(self) -> None:
        assert self.instance.file_path == "file_path"


class TestProfileDoesNotExist(TestISortError):
    def setup_class(self) -> None:
        self.instance: exceptions.ProfileDoesNotExist = exceptions.ProfileDoesNotExist("profile")

    def test_variables(self) -> None:
        assert self.instance.profile == "profile"


class TestSortingFunctionDoesNotExist(TestISortError):
    def setup_class(self) -> None:
        self.instance: exceptions.SortingFunctionDoesNotExist = (
            exceptions.SortingFunctionDoesNotExist("round", ["square", "peg"])
        )

    def test_variables(self) -> None:
        assert self.instance.sort_order == "round"
        assert self.instance.available_sort_orders == ["square", "peg"]


class TestLiteralParsingFailure(TestISortError):
    def setup_class(self) -> None:
        self.instance: exceptions.LiteralParsingFailure = exceptions.LiteralParsingFailure(
            "x = [", SyntaxError
        )

    def test_variables(self) -> None:
        assert self.instance.code == "x = ["
        assert self.instance.original_error is SyntaxError


class TestLiteralSortTypeMismatch(TestISortError):
    def setup_class(self) -> None:
        self.instance: exceptions.LiteralSortTypeMismatch = exceptions.LiteralSortTypeMismatch(
            tuple, list
        )

    def test_variables(self) -> None:
        assert self.instance.kind is tuple
        assert self.instance.expected_kind is list


class TestAssignmentsFormatMismatch(TestISortError):
    def setup_class(self) -> None:
        self.instance: exceptions.AssignmentsFormatMismatch = exceptions.AssignmentsFormatMismatch(
            "print x"
        )

    def test_variables(self) -> None:
        assert self.instance.code == "print x"


class TestUnsupportedSettings(TestISortError):
    def setup_class(self) -> None:
        self.instance: exceptions.UnsupportedSettings = exceptions.UnsupportedSettings(
            {"apply": {"value": "true", "source": "/"}}
        )

    def test_variables(self) -> None:
        assert self.instance.unsupported_settings == {"apply": {"value": "true", "source": "/"}}


class TestUnsupportedEncoding(TestISortError):
    def setup_class(self) -> None:
        self.instance: exceptions.UnsupportedEncoding = exceptions.UnsupportedEncoding("file.py")

    def test_variables(self) -> None:
        assert self.instance.filename == "file.py"