//! Generate MessagePack fixture files for cross-language testing (D-030 Layer 1). //! Run with: cargo test --test gen_fixtures -- --ignored use settled_reach_server::bridge::types::*; use std::fs; use std::path::Path; fn write_fixture(name: &str, bytes: &[u8]) { // Write directly into the Godot project's test fixtures (single source of truth) let dir = Path::new("../client/tests/fixtures/msgpack"); fs::create_dir_all(dir).expect("create fixture dir"); let path = dir.join(format!("{}.msgpack", name)); fs::write(&path, bytes).expect("write fixture"); eprintln!("Wrote {} ({} bytes)", path.display(), bytes.len()); } #[test] #[ignore] // Run manually: cargo test --test gen_fixtures -- --ignored fn generate_msgpack_fixtures() { // Snapshot with one NPC entity let snapshot = ObserverSnapshot { tick: 42, entities: vec![VisibleEntity { entity_id: 1, x: 10.0, y: 20.0, z: 0, kind: EntityKind::Npc, }], }; write_fixture("snapshot_one_npc", &rmp_serde::to_vec_named(&snapshot).unwrap()); // Empty snapshot let empty = ObserverSnapshot { tick: 0, entities: vec![], }; write_fixture("snapshot_empty", &rmp_serde::to_vec_named(&empty).unwrap()); // PlayerInput: MoveNorth let input_north = PlayerInput { tick: 100, action: PlayerAction::MoveNorth, }; write_fixture("input_move_north", &rmp_serde::to_vec_named(&input_north).unwrap()); // PlayerInput: UsePerceptionMode let input_perception = PlayerInput { tick: 200, action: PlayerAction::UsePerceptionMode("thermal".to_string()), }; write_fixture("input_perception_mode", &rmp_serde::to_vec_named(&input_perception).unwrap()); // Snapshot with multiple entities and all EntityKind variants let snapshot_multi = ObserverSnapshot { tick: 999, entities: vec![ VisibleEntity { entity_id: 1, x: 5.0, y: 10.0, z: 0, kind: EntityKind::Npc }, VisibleEntity { entity_id: 2, x: 15.5, y: 3.0, z: 1, kind: EntityKind::Object }, VisibleEntity { entity_id: 3, x: 0.0, y: 0.0, z: -1, kind: EntityKind::Terrain }, ], }; write_fixture("snapshot_multi_entity", &rmp_serde::to_vec_named(&snapshot_multi).unwrap()); // Diagonal movement fixtures (clockwise: NE, SE, SW, NW) for (name, action) in [ ("input_move_northeast", PlayerAction::MoveNortheast), ("input_move_southeast", PlayerAction::MoveSoutheast), ("input_move_southwest", PlayerAction::MoveSouthwest), ("input_move_northwest", PlayerAction::MoveNorthwest), ] { let input = PlayerInput { tick: 100, action }; write_fixture(name, &rmp_serde::to_vec_named(&input).unwrap()); } }