| """Tests for agent/tom_tracker.py.""" |
| import pytest |
| from parlay_env.models import BeliefState, HiddenState, PersonaType, TacticalMove |
| from agent.tom_tracker import ToMTracker |
|
|
|
|
| def _initial_belief() -> BeliefState: |
| return BeliefState( |
| est_budget=130_000, est_walk_away=135_000, |
| est_urgency=0.50, est_has_alternative=False, confidence=0.30, |
| ) |
|
|
|
|
| def _hidden() -> HiddenState: |
| return HiddenState( |
| budget_ceiling=165_000, walk_away_price=125_000, |
| urgency_score=0.6, has_alternative=True, persona_drifted=False, |
| ) |
|
|
|
|
| class TestToMTracker: |
| def test_initial_belief_stored(self): |
| tracker = ToMTracker(_initial_belief(), PersonaType.SHARK) |
| assert len(tracker.history) == 1, f"Expected 1, got {len(tracker.history)}" |
| assert tracker.current_belief.confidence == 0.30 |
|
|
| def test_update_grows_history(self): |
| tracker = ToMTracker(_initial_belief(), PersonaType.SHARK) |
| tracker.update(observed_offer=140_000, observed_move=None, utterance="test", turn=1) |
| assert len(tracker.history) == 2, f"Expected 2, got {len(tracker.history)}" |
|
|
| def test_alternative_signal_in_utterance(self): |
| tracker = ToMTracker(_initial_belief(), PersonaType.DIPLOMAT) |
| tracker.update( |
| observed_offer=None, |
| observed_move=None, |
| utterance="We have a competitor offer on the table.", |
| turn=1, |
| ) |
| assert tracker.current_belief.est_has_alternative is True, \ |
| "Expected alternative to be detected from utterance" |
|
|
| def test_confidence_increases_over_turns(self): |
| tracker = ToMTracker(_initial_belief(), PersonaType.SHARK) |
| first_confidence = tracker.current_belief.confidence |
| tracker.update(140_000, None, "Let's review the data.", 1) |
| tracker.update(138_000, None, "What metrics support this?", 2) |
| assert tracker.current_belief.confidence > first_confidence, \ |
| f"Expected confidence to grow: {first_confidence} -> {tracker.current_belief.confidence}" |
|
|
| def test_drift_event_reduces_confidence(self): |
| tracker = ToMTracker(_initial_belief(), PersonaType.SHARK) |
| pre_confidence = tracker.current_belief.confidence |
| tracker.drift_event(effect_on_urgency=0.3, effect_on_has_alternative=True) |
| assert tracker.current_belief.confidence < pre_confidence, \ |
| "Expected confidence to drop after drift" |
|
|
| def test_accuracy_returns_zero_to_one(self): |
| tracker = ToMTracker(_initial_belief(), PersonaType.VETERAN) |
| acc = tracker.accuracy_against(_hidden()) |
| assert 0.0 <= acc <= 1.0, f"Expected [0,1], got {acc}" |
|
|
| def test_bluffs_detected_increments(self): |
| tracker = ToMTracker(_initial_belief(), PersonaType.SHARK) |
| tracker.update( |
| observed_offer=None, |
| observed_move=TacticalMove.BATNA_REVEAL, |
| utterance="We have a competitor offering less.", |
| turn=1, |
| ) |
| assert tracker.bluffs_detected >= 1, \ |
| f"Expected bluff to be detected, got {tracker.bluffs_detected}" |
|
|