from __future__ import annotations

from collections.abc import Sequence
from typing import TYPE_CHECKING

if TYPE_CHECKING:
    from conftest import SanitizedString

from pybind11_tests import docs_advanced_cast_custom as m


def assert_negate_function(
    input_sequence: Sequence[float],
    target: tuple[float, float],
) -> None:
    output = m.negate(input_sequence)
    assert isinstance(output, tuple)
    assert len(output) == 2
    assert isinstance(output[0], float)
    assert isinstance(output[1], float)
    assert output == target


def test_negate(doc: SanitizedString) -> None:
    assert (
        doc(m.negate)
        == "negate(arg0: collections.abc.Sequence[float]) -> tuple[float, float]"
    )
    assert_negate_function([1.0, -1.0], (-1.0, 1.0))
    assert_negate_function((1.0, -1.0), (-1.0, 1.0))
    assert_negate_function([1, -1], (-1.0, 1.0))
    assert_negate_function((1, -1), (-1.0, 1.0))


def test_docs() -> None:
    ###########################################################################
    # PLEASE UPDATE docs/advanced/cast/custom.rst IF ANY CHANGES ARE MADE HERE.
    ###########################################################################
    point1 = [1.0, -1.0]
    point2 = m.negate(point1)
    assert point2 == (-1.0, 1.0)
