jarvis / tests /test_runtime_multimodal.py
Jonathan Haas
refactor: extract multimodal and persona runtime helpers
3c4e35a
Raw
History Blame Contribute Delete
2.94 kB
from __future__ import annotations
from types import SimpleNamespace
from unittest.mock import MagicMock
from jarvis.runtime_multimodal import (
multimodal_grounding_snapshot,
multimodal_grounding_snapshot_for_runtime,
)
def test_multimodal_grounding_snapshot_high_confidence() -> None:
payload = multimodal_grounding_snapshot(
face_age_sec=1.0,
hand_age_sec=2.0,
doa_age_sec=1.0,
doa_angle=20.0,
doa_speech=True,
stt_diagnostics={"confidence_score": 0.92, "confidence_band": "high"},
attention_confidence=1.0,
attention_source="face",
recency_threshold_sec=30.0,
)
assert payload["confidence_band"] in {"high", "medium"}
assert payload["overall_confidence"] >= 0.75
assert payload["signals"]["face_recent"] is True
def test_multimodal_grounding_snapshot_low_confidence_reasons() -> None:
payload = multimodal_grounding_snapshot(
face_age_sec=120.0,
hand_age_sec=120.0,
doa_age_sec=120.0,
doa_angle=None,
doa_speech=None,
stt_diagnostics={"confidence_score": 0.15, "confidence_band": "low"},
attention_confidence=0.1,
attention_source="unknown",
recency_threshold_sec=30.0,
)
assert payload["confidence_band"] == "low"
reasons = set(payload["reasons"])
assert "face_signal_stale" in reasons
assert "stt_low_confidence" in reasons
assert "attention_source_unknown" in reasons
def test_multimodal_grounding_snapshot_context_downgrades_non_speech_doa() -> None:
payload = multimodal_grounding_snapshot(
face_age_sec=None,
hand_age_sec=None,
doa_age_sec=5.0,
doa_angle=15.0,
doa_speech=False,
stt_diagnostics={"confidence_score": 0.7, "confidence_band": "medium"},
attention_confidence=0.5,
attention_source="doa",
recency_threshold_sec=30.0,
)
assert payload["signals"]["doa_recent"] is True
assert payload["signals"]["doa_speech"] is False
assert "doa_reports_non_speech" in payload["reasons"]
def test_multimodal_grounding_snapshot_for_runtime_computes_signal_ages() -> None:
runtime = SimpleNamespace(
presence=SimpleNamespace(
signals=SimpleNamespace(face_last_seen=8.0, hand_last_seen=9.0, doa_last_seen=9.5),
attention_source=lambda: "face",
),
_last_doa_angle=20.0,
_last_doa_speech=True,
_stt_diagnostics_snapshot=lambda: {"confidence_score": 0.8, "confidence_band": "high"},
_attention_confidence=MagicMock(return_value=0.9),
)
payload = multimodal_grounding_snapshot_for_runtime(
runtime,
recency_threshold_sec=30.0,
now_monotonic_fn=lambda: 10.0,
)
assert payload["signals"]["face_recent"] is True
assert payload["signals"]["doa_recent"] is True
runtime._attention_confidence.assert_called_once_with(10.0)