| 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) |
|
|