use flatland_protocol::{
frame::{read_server_message, write_server_message, write_client_message},
ClientMessage, Intent, ServerMessage,
};
use flatland_sim::{craft::BlueprintBook, RegionSim, WorldSegment};
#[tokio::test]
async fn starter_plains_tick_frame_under_limit() {
const MAX: usize = 1_048_576;
let segment_path = flatland_sim::default_seed_segment_path();
let world = WorldSegment::from_yaml_file(&segment_path).expect("starter segment");
let blueprint_dir = flatland_sim::craft::default_blueprints_path();
let book = BlueprintBook::from_yaml_dir(&blueprint_dir).expect("blueprints");
let mut sim = RegionSim::with_blueprints(world, book);
let id = sim.spawn_player_at(128.0, 128.0, 0.0);
sim.tick();
let welcome = sim.welcome_snapshot(id);
let delta = sim.tick_delta_for(id);
let mut welcome_buf = Vec::new();
write_server_message(
&mut welcome_buf,
&ServerMessage::Welcome(flatland_protocol::Welcome {
session_id: 1,
entity_id: id,
snapshot: welcome,
}),
)
.await
.expect("encode welcome");
let mut tick_buf = Vec::new();
write_server_message(&mut tick_buf, &ServerMessage::Tick(delta))
.await
.expect("encode tick");
let mut stop_buf = Vec::new();
write_client_message(
&mut stop_buf,
&ClientMessage::Intent(Intent::Stop {
entity_id: id,
seq: 1,
}),
)
.await
.expect("encode stop");
eprintln!("welcome frame: {} bytes", welcome_buf.len());
eprintln!("tick frame: {} bytes", tick_buf.len());
eprintln!("stop frame: {} bytes", stop_buf.len());
assert!(
welcome_buf.len() <= MAX,
"welcome frame too large: {}",
welcome_buf.len()
);
assert!(
tick_buf.len() <= MAX,
"tick frame too large: {}",
tick_buf.len()
);
assert!(tick_buf.len() < 256 * 1024, "tick unexpectedly large");
let mut cursor = std::io::Cursor::new(&welcome_buf);
let decoded = read_server_message(&mut cursor)
.await
.expect("welcome roundtrip decode");
assert!(matches!(decoded, ServerMessage::Welcome(_)));
let mut cursor = std::io::Cursor::new(&tick_buf);
let decoded = read_server_message(&mut cursor)
.await
.expect("tick roundtrip decode");
assert!(matches!(decoded, ServerMessage::Tick(_)));
}