//! Tests de la boucle d'un tour, sur un faux hôte aux réponses scriptées. use super::*; use crate::chat::compact::CompactConfig; use crate::chat::types::{StatsEvent, ToolFunction}; use crate::chat::wire::resolve_chat_endpoint; use serde_json::json; use std::collections::VecDeque; use std::sync::Mutex; /// Une réponse scriptée du moteur. enum Script { Ok(Vec), Status(u16, String), Net(NetKind), /// Corps qui s'interrompt sur une erreur de lecture après ces lignes. Cut(Vec), } /// Une complétion signalée à la sonde : (outils, kwargs, effort). type Completion = (usize, Option>, String); #[derive(Default)] struct Fake { script: Mutex>, bodies: Mutex>, tools: Mutex>, execs: Mutex>, compacted: Mutex>>, phases: Mutex>, queued: Mutex>, efforts: Mutex>, /// L'arrêt à déclencher pendant l'exécution d'un outil. stop_on_exec: Mutex>>, /// Verdict « préfixe instable » de la sonde (NUDGE_IN_TOOL). unstable: Mutex, /// Complétions signalées à la sonde : (outils, kwargs, effort). completions: Mutex>, /// Télémétrie rangée ; et ce que le Go en tire. perfs: Mutex>, marks: Mutex, /// Slot rendu par l'hôte (SIDE_SLOT) ; demandes reçues. slot: Mutex>, slot_asks: Mutex, /// KEEP_TURN_IMAGES : budget (clé valable pour le tour) ; image relayée /// par chaque outil ; rangements demandés (refusés si `keep_refuse`). keep: Mutex>, relay: Mutex>, keep_stores: Mutex, keep_refuse: Mutex, /// PREWARM : la requête prolonge-t-elle le préchauffage ? ce que `send` /// a reçu. prewarm_match: Mutex, sent_keeps: Mutex>, /// PROJ_SNAPSHOT : clé posée pour ce tour ; rafraîchissements demandés. snap_on: Mutex, refreshes: Mutex, } impl Fake { fn new(script: Vec