from src.config_loader import UnifiedLogSettings from src.models import FrameInfo, PersonStateEvent, TrackEvent, TurnEvent, VoicePromptEvent from src.unified_event_builder import UnifiedEventBuilder def cfg(important:bool=False)->UnifiedLogSettings: return UnifiedLogSettings(True,"x",True,True,True,True,30,True,True,True,True,False,important,"",True) def test_converts_sources_and_sorts() -> None: b=UnifiedEventBuilder(cfg(),"exp","session"); f=FrameInfo(2,"t",2.,10,10,1.) items=[] items+=b.from_track_events([TrackEvent("trigger_crossed",1,2,"t",2.,1,1)],f) items+=b.from_turn_events([TurnEvent("turn_confirmed",1,2,"t",2.,1.,20.,"weak")],f) items+=b.from_voice_events([VoicePromptEvent("prompt_played",1,2,"t",2.,"prompt",True)],f) items+=b.from_person_state_events([PersonStateEvent("responded",1,2,"t",2.,"observing","responded")],f) assert {x.source for x in items}=={"tracking","turn","voice","person_state"} assert len({x.event_id for x in items})==4 assert b.stable_sort(items)==sorted(items,key=lambda x:(x.elapsed_time_sec,x.frame_number,x.source,x.event_id)) def test_important_only_filters() -> None: b=UnifiedEventBuilder(cfg(True),"e","s");f=FrameInfo(1,"t",1.,1,1,1.) assert not b.from_track_events([TrackEvent("track_created",1,1,"t",1.,1,1)],f)