from __future__ import annotations from app.exercises.dead_bug.state_machine import DeadBugStateMachine from app.exercises.dead_bug.types import DeadBugMetrics, DeadBugPhase class TestDeadBugStateMachine: def _ready_metrics(self) -> DeadBugMetrics: return DeadBugMetrics( left_arm_extended=False, right_arm_extended=False, left_leg_extended=False, right_leg_extended=False, left_elbow_angle=90, right_elbow_angle=90, left_knee_angle=100, right_knee_angle=100, feedback=[], ) def _extended_left(self) -> DeadBugMetrics: return DeadBugMetrics( left_arm_extended=True, right_arm_extended=False, left_leg_extended=False, right_leg_extended=True, left_elbow_angle=160, right_elbow_angle=90, left_knee_angle=90, right_knee_angle=160, feedback=[], ) def test_initial_state(self): sm = DeadBugStateMachine() assert sm.phase == DeadBugPhase.READY assert sm.rep_count == 0 def test_no_transition_in_ready(self): sm = DeadBugStateMachine() result = sm.update(self._ready_metrics()) assert sm.phase == DeadBugPhase.READY assert result.rep_count == 0 def test_confirm_extension(self): sm = DeadBugStateMachine(extension_confirm_frames=2, reset_confirm_frames=2) sm.update(self._extended_left()) assert sm.phase == DeadBugPhase.READY sm.update(self._extended_left()) assert sm.phase == DeadBugPhase.EXTENDING