amogus/tests/test_meeting_flow.py
Antigravity 071906df59 feat: Complete LLM agent framework with fog-of-war, meeting flow, and prompt assembly
- Core engine: simulator, game mechanics, triggers (138 tests)
- Fog-of-war per-player state tracking
- Meeting flow: interrupt, discussion, voting, consolidation
- Prompt assembler with strategy injection tiers
- LLM client with fallbacks for models without JSON/system support
- Prompt templates: action, discussion, voting, reflection
- Full integration in main.py orchestrator
- Verified working with free OpenRouter models (Gemma)
2026-02-01 00:00:34 -05:00

109 lines
3.8 KiB
Python

"""
Tests for the meeting flow manager.
"""
import unittest
import sys
import os
sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
from src.engine.meeting_flow import MeetingFlowManager
class TestMeetingFlowManager(unittest.TestCase):
"""Tests for MeetingFlowManager."""
def setUp(self):
self.meeting = MeetingFlowManager()
def test_start_meeting(self):
state = self.meeting.start_meeting("red", "body_report", "electrical")
self.assertTrue(self.meeting.is_meeting_active())
self.assertEqual(state.called_by, "red")
self.assertEqual(state.reason, "body_report")
def test_submit_interrupt_note(self):
self.meeting.start_meeting("red", "emergency")
self.meeting.submit_interrupt_note("blue", {"was_doing": "going to electrical"})
note = self.meeting.current_meeting.interrupt_notes.get("blue")
self.assertIsNotNone(note)
self.assertEqual(note["was_doing"], "going to electrical")
def test_meeting_scratchpad(self):
self.meeting.start_meeting("red", "emergency")
self.meeting.init_meeting_scratchpad("blue", {"suspects": []})
self.meeting.update_meeting_scratchpad("blue", {"suspects": ["red"]})
pad = self.meeting.get_meeting_scratchpad("blue")
self.assertEqual(pad["suspects"], ["red"])
def test_add_message(self):
self.meeting.start_meeting("red", "emergency")
self.meeting.add_message("red", "Red", "Where was everyone?")
self.meeting.add_message("blue", "Blue", "I was in medbay", target="Red")
transcript = self.meeting.get_transcript()
self.assertEqual(len(transcript), 2)
self.assertEqual(transcript[1]["target"], "Red")
def test_voting(self):
self.meeting.start_meeting("red", "emergency")
self.meeting.submit_vote("red", "blue")
self.meeting.submit_vote("blue", "skip")
self.meeting.submit_vote("green", "blue")
self.assertTrue(self.meeting.has_voted("red"))
self.assertTrue(self.meeting.all_voted(["red", "blue", "green"]))
def test_tally_votes_ejection(self):
self.meeting.start_meeting("red", "emergency")
self.meeting.submit_vote("red", "blue")
self.meeting.submit_vote("green", "blue")
self.meeting.submit_vote("blue", "skip")
ejected, details = self.meeting.tally_votes()
self.assertEqual(ejected, "blue")
self.assertEqual(details["counts"]["blue"], 2)
def test_tally_votes_tie(self):
self.meeting.start_meeting("red", "emergency")
self.meeting.submit_vote("red", "blue")
self.meeting.submit_vote("blue", "red")
self.meeting.submit_vote("green", "skip")
ejected, details = self.meeting.tally_votes()
self.assertIsNone(ejected)
self.assertTrue(details["was_tie"])
def test_tally_votes_skip_wins(self):
self.meeting.start_meeting("red", "emergency")
self.meeting.submit_vote("red", "skip")
self.meeting.submit_vote("blue", "skip")
self.meeting.submit_vote("green", "blue")
ejected, details = self.meeting.tally_votes()
self.assertIsNone(ejected)
def test_end_meeting(self):
self.meeting.start_meeting("red", "emergency")
self.meeting.submit_vote("red", "blue")
self.meeting.submit_vote("green", "blue")
state = self.meeting.end_meeting("blue", was_impostor=True)
self.assertFalse(self.meeting.is_meeting_active())
self.assertEqual(len(self.meeting.meeting_history), 1)
self.assertEqual(state.ejected, "blue")
self.assertTrue(state.was_impostor)
if __name__ == "__main__":
unittest.main()