import pytest from hermes_face.arbiter import Heartbeat, resolve_state @pytest.mark.parametrize('agent,audio,expected', [ ('sleeping', 'quiet', 'sleeping'), ('sleeping', 'listening', 'sleeping'), # room sound never wakes the face ('sleeping', 'speaking', 'sleeping'), ('idle', 'quiet', 'idle'), ('idle', 'listening', 'listening'), ('idle', 'speaking', 'speaking'), ('thinking', 'quiet', 'thinking'), ('thinking', 'listening', 'listening'), # a voice interrupts the thinking face ('listening', 'quiet', 'listening'), ('speaking', 'quiet', 'speaking'), # the agent says it is speaking before the audio shows it ('thinking', 'speaking', 'speaking'), ]) def test_priority(agent, audio, expected): assert resolve_state(agent, audio) == expected def test_heartbeat_expires_without_beats_and_recovers(): hb = Heartbeat(10.0) assert not hb.alive(0.0) # never heard from: not alive hb.beat(5.0) assert hb.alive(5.0) and hb.alive(15.0) assert not hb.alive(15.1) hb.beat(20.0) assert hb.alive(25.0) def test_heartbeat_disabled_is_always_alive(): assert Heartbeat(0).alive(1e9) and Heartbeat(-1).alive(0.0)