from pathlib import Path ROOT = Path(__file__).resolve().parents[1] def read_text(path: str) -> str: return (ROOT / path).read_text(encoding="utf-8") def require(condition: bool, message: str) -> None: if not condition: raise SystemExit(message) def main() -> None: app = read_text("main/application.cc") mqtt_header = read_text("main/boards/sening-xiaozhi-s3/mqtt.h") board = read_text("main/boards/sening-xiaozhi-s3/sening_xiaozhi_s3.cc") require( "void BoardMqtt_ResumePlaylistIfUnfinished(void);" in mqtt_header, "MQTT header must expose unfinished playlist resume API", ) restore_body = app.split("void Application::RestoreFromPowerOffStandby(bool network_ready)", 1)[1].split( "void Application::AcquireSleepInhibit", 1 )[0] require( "BoardMqtt_ResumePlaylistIfUnfinished();" in restore_body, "power-off standby restore must check for unfinished MQTT playlist", ) require( restore_body.find("audio_service_.EnableWakeWordDetection(true);") < restore_body.find("BoardMqtt_ResumePlaylistIfUnfinished();"), "playlist resume check should run after restore re-enables normal application state", ) board_restore_body = board.split("esp_err_t RestoreFromPowerOffStandby(int timeout_ms)", 1)[1].split( "bool IsPowerOffStandby", 1 )[0] require( "Application::GetInstance().RestoreFromPowerOffStandby(network_ready);" in board_restore_body, "board power-off restore must delegate application-level restore logic", ) if __name__ == "__main__": main()