from src.config_loader import PersonStateSettings from src.person_state_rules import choose_status, final_exclusion_reason, normalize_exclusion_reason CFG = PersonStateSettings(True, .5, False, True, False, True, True) def test_status_priority_chain() -> None: assert choose_status(tracked=True) == "tracked" assert choose_status(tracked=True, inside_region=True) == "inside_region" assert choose_status(eligible=True) == "eligible" assert choose_status(prompt_played=True) == "prompted" assert choose_status(pseudo_prompt=True) == "pseudo_prompted" assert choose_status(observing=True) == "observing_response" assert choose_status(responded=True, lost=True) == "lost" assert choose_status(responded=True) == "responded" assert choose_status(no_response=True) == "no_response" assert choose_status(finalized=True) == "completed" assert choose_status(excluded=True, finalized=True) == "excluded" def test_exclusion_rules() -> None: assert final_exclusion_reason(CFG, .1, True, True, None, None, False, True, False) == "track_too_short" assert final_exclusion_reason(CFG, 1., True, False, None, None, False, False, False) == "not_prompt_eligible" assert final_exclusion_reason(CFG, 1., True, True, None, "prompt_failed", False, True, False) == "prompt_failed" assert normalize_exclusion_reason("no_turn_state") == "response_not_evaluable"