- 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)
109 lines
3.8 KiB
Python
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()
|