5f07027faa
Preserve the adapter facade and move adapter-only checks out of domain tests. Late tracks do not reveal an unseen launch origin or its timestamp. Co-Authored-By: Codex GPT-6.1 Terra <noreply@openai.com>
38 lines
1.7 KiB
Rust
38 lines
1.7 KiB
Rust
//! The adapter re-exports the actual core types and keeps deterministic combat traces.
|
|
use glam::DVec3;
|
|
|
|
macro_rules! trace {
|
|
($sim:path) => {{
|
|
use $sim::{DroneKind, Ground, Out, Sam, SamKind, Sim};
|
|
let mut sim = Sim::new(0x87);
|
|
let id = sim.id();
|
|
sim.sams.push(Sam::new(id, SamKind::Patriot, DVec3::new(0.0, 64.0, 0.0), 0.0));
|
|
let mut out = Out::default();
|
|
for (i, kind) in [DroneKind::Shahed, DroneKind::Kh101, DroneKind::Iskander].into_iter().enumerate() {
|
|
sim.launch(kind, DVec3::new(i as f64 * 100.0, 110.0, 800.0), -DVec3::Z, DVec3::new(0.0, 64.0, 0.0), &mut out);
|
|
}
|
|
let mut ground = Ground::default();
|
|
let mut trace = Vec::new();
|
|
for _ in 0..600 {
|
|
let wanted = ground.take_wanted();
|
|
ground.answer(wanted.into_iter().map(|(x, z)| (x, z, 64)).collect(), sim.tick);
|
|
out = Out::default();
|
|
sim.step(&mut ground, None, &mut out);
|
|
trace.push(format!("{}:{}:{}:{}:{:?}:{:?}:{:?}:{:?}", sim.tick, sim.launched, sim.kills, sim.hits,
|
|
sim.sams.iter().map(|s| (s.id, s.missiles, s.fired, s.health)).collect::<Vec<_>>(),
|
|
sim.drones.iter().map(|d| (d.id, d.pos, d.vel)).collect::<Vec<_>>(),
|
|
sim.missiles.iter().map(|m| (m.id, m.pos)).collect::<Vec<_>>(), out.messages));
|
|
}
|
|
(trace, sim.sams.iter().map(|s| s.fired).sum::<u32>())
|
|
}};
|
|
}
|
|
|
|
#[test]
|
|
fn adapter_reexports_core_and_combat_trace_is_deterministic() {
|
|
let _: airdef_core::sim::Sim = airdef::sim::Sim::new(1);
|
|
let adapter = trace!(airdef::sim);
|
|
let core = trace!(airdef_core::sim);
|
|
assert_eq!(adapter, core);
|
|
assert!(adapter.1 > 0, "the trace must include actual interceptor launches");
|
|
}
|