You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
spiel/tests/transitions/test_swipe.py

122 lines
3.2 KiB
Python

import pytest
from hypothesis import HealthCheck, given, settings
from hypothesis.strategies import floats
from textual.css.scalar import Scalar, ScalarOffset, Unit
from textual.widget import Widget
from spiel import Direction, Swipe, Transition
@pytest.fixture
def transition() -> Swipe:
return Swipe()
Y = Scalar.parse("0", percent_unit=Unit.HEIGHT)
@pytest.mark.parametrize(
"direction, to_offset",
[
(Direction.Next, ScalarOffset(Scalar.parse("100%"), Y)),
],
)
def test_swipe_initialize(
from_widget: Widget,
to_widget: Widget,
direction: Direction,
to_offset: tuple[object, object],
) -> None:
Swipe().initialize(from_widget=from_widget, to_widget=to_widget, direction=direction)
assert to_widget.styles.offset == to_offset
@pytest.mark.parametrize(
"progress, direction, from_offset, to_offset",
[
(
0,
Direction.Next,
ScalarOffset(Scalar.parse("-0%"), Y),
ScalarOffset(Scalar.parse("100%"), Y),
),
(
25,
Direction.Next,
ScalarOffset(Scalar.parse("-25%"), Y),
ScalarOffset(Scalar.parse("75%"), Y),
),
(
50,
Direction.Next,
ScalarOffset(Scalar.parse("-50%"), Y),
ScalarOffset(Scalar.parse("50%"), Y),
),
(
75,
Direction.Next,
ScalarOffset(Scalar.parse("-75%"), Y),
ScalarOffset(Scalar.parse("25%"), Y),
),
(
75.123,
Direction.Next,
ScalarOffset(Scalar.parse("-75.12%"), Y),
ScalarOffset(Scalar.parse("24.88%"), Y),
),
(
75.126,
Direction.Next,
ScalarOffset(Scalar.parse("-75.13%"), Y),
ScalarOffset(Scalar.parse("24.87%"), Y),
),
(
100,
Direction.Next,
ScalarOffset(Scalar.parse("-100%"), Y),
ScalarOffset(Scalar.parse("0%"), Y),
),
],
)
def test_swipe_progress(
transition: Transition,
from_widget: Widget,
to_widget: Widget,
progress: float,
direction: Direction,
from_offset: tuple[object, object],
to_offset: tuple[object, object],
) -> None:
transition.initialize(from_widget=from_widget, to_widget=to_widget, direction=direction)
transition.progress(
from_widget=from_widget,
to_widget=to_widget,
direction=direction,
progress=progress,
)
assert from_widget.styles.offset == from_offset
assert to_widget.styles.offset == to_offset
@given(progress=floats(min_value=0, max_value=100))
@settings(suppress_health_check=[HealthCheck.function_scoped_fixture])
def test_swipe_progress_always_balances_for_right(
transition: Transition,
from_widget: Widget,
to_widget: Widget,
progress: float,
) -> None:
transition.initialize(from_widget=from_widget, to_widget=to_widget, direction=Direction.Next)
transition.progress(
from_widget=from_widget,
to_widget=to_widget,
direction=Direction.Next,
progress=progress,
)
assert abs(from_widget.styles.offset.x.value) + to_widget.styles.offset.x.value == 100