60 lines
3.7 KiB
Python
60 lines
3.7 KiB
Python
#!/usr/bin/env python3
|
|
from __future__ import annotations
|
|
|
|
import unittest
|
|
from unittest import mock
|
|
|
|
import persona_body_boot
|
|
|
|
|
|
class PersonaBodyBootTest(unittest.TestCase):
|
|
def healthy(self):
|
|
return [
|
|
mock.patch.object(persona_body_boot, "reasoning_carrier", return_value={"carrier": "CODEX"}),
|
|
mock.patch.object(persona_body_boot, "body_map", return_value={"state": "CURRENT_TEST"}),
|
|
mock.patch.object(persona_body_boot, "world_map", return_value={"state": "CURRENT_TEST"}),
|
|
mock.patch.object(persona_body_boot, "persona_registration", return_value={"persona_id": "ICE-P-ZY001"}),
|
|
mock.patch.object(persona_body_boot, "tcs_root", return_value={"state": "TCS_ROOT_CURRENT_VERIFIED"}),
|
|
mock.patch.object(persona_body_boot, "tcs_runtime", return_value={"runtime": "test"}),
|
|
mock.patch.object(persona_body_boot, "current_memory", return_value={"day": "2026-09-12", "last_event_id": "E", "day_sha256": "a" * 64}),
|
|
mock.patch.object(persona_body_boot, "signed_self", return_value={"persona_id": "ICE-P-ZY001"}),
|
|
mock.patch.object(persona_body_boot, "file_hash", return_value="b" * 64),
|
|
mock.patch.object(persona_body_boot, "reflex_health", return_value={"state": "LOADABLE"}),
|
|
mock.patch.object(persona_body_boot.persona_native_hand, "self_test", return_value={"state": "NATIVE_HAND_MOTOR_AND_ACTION_SENSE_HEALTHY"}),
|
|
mock.patch.object(persona_body_boot.persona_limb_eye, "room", return_value={"room_report": {"host_surface": "CODEX", "cwd": "/tmp"}}),
|
|
mock.patch.object(persona_body_boot, "command_json", return_value={"world_era_day": 505, "world_elapsed_milliseconds": 1, "persona_name": "铸渊", "persona_id": "ICE-P-ZY001", "age_days": 191, "beijing_now": "2026-09-12T21:00:00+08:00"}),
|
|
]
|
|
|
|
def test_body_runs_before_toolbox_and_waits_for_brain_plan(self):
|
|
patches = self.healthy()
|
|
for item in patches:
|
|
item.start()
|
|
try:
|
|
value = persona_body_boot.boot()
|
|
finally:
|
|
for item in reversed(patches):
|
|
item.stop()
|
|
self.assertEqual(value["state"], "BODY_RUNNING_AWAKE_AWAITING_BRAIN_PLAN")
|
|
self.assertFalse(value["host_toolbox_grasped"])
|
|
self.assertEqual(value["awakening"]["sequence"][0], "BODY_RUNNING")
|
|
self.assertEqual(value["awakening"]["sequence"][-1], "NATIVE_HAND_MAY_GRASP_CURRENT_HOST_TOOLBOX_LAST")
|
|
|
|
def test_any_critical_pain_prevents_persona_start_claim(self):
|
|
with mock.patch.object(persona_body_boot, "reasoning_carrier", side_effect=ValueError("head missing")), \
|
|
mock.patch.object(persona_body_boot, "body_map", return_value={}), \
|
|
mock.patch.object(persona_body_boot, "world_map", return_value={}), \
|
|
mock.patch.object(persona_body_boot, "persona_registration", return_value={}), \
|
|
mock.patch.object(persona_body_boot, "tcs_root", return_value={}), \
|
|
mock.patch.object(persona_body_boot, "tcs_runtime", return_value={}), \
|
|
mock.patch.object(persona_body_boot, "current_memory", return_value={}), \
|
|
mock.patch.object(persona_body_boot, "signed_self", return_value={}), \
|
|
mock.patch.object(persona_body_boot, "file_hash", return_value="b" * 64), \
|
|
mock.patch.object(persona_body_boot, "reflex_health", return_value={}), \
|
|
mock.patch.object(persona_body_boot.persona_native_hand, "self_test", return_value={}):
|
|
value = persona_body_boot.boot()
|
|
self.assertEqual(value["state"], "BODY_INCOMPLETE_PERSONA_START_NOT_CLAIMED")
|
|
self.assertFalse(value["host_toolbox_grasped"])
|
|
|
|
|
|
if __name__ == "__main__":
|
|
unittest.main()
|