#![cfg(test)]
use crate::world::local::local_entity::RemoteEntity;
use crate::world::sync::config::EngineConfig;
use crate::{
world::{
component::component_kinds::ComponentKind, entity::entity_message::EntityMessage,
sync::RemoteEngine,
},
EntityAuthStatus, HostType,
};
struct AssertList {
asserts: Vec<EntityMessage<RemoteEntity>>,
}
impl AssertList {
fn new() -> Self {
Self {
asserts: Vec::new(),
}
}
fn push(&mut self, msg: EntityMessage<RemoteEntity>) {
self.asserts.push(msg);
}
fn check(&self, engine: &mut RemoteEngine<RemoteEntity>) {
let out = engine.take_incoming_events();
assert_eq!(
self.asserts.len(),
out.len(),
"Expected {} messages, got {}",
self.asserts.len(),
out.len()
);
for (i, assert_msg) in self.asserts.iter().enumerate() {
assert_eq!(
assert_msg, &out[i],
"At index {}, output message: {:?} not equal to expected message: {:?}",
i, &out[i], assert_msg
);
}
}
}
struct ComponentType<const T: u8>;
fn component_kind<const T: u8>() -> ComponentKind {
ComponentKind::from(std::any::TypeId::of::<ComponentType<T>>())
}
#[test]
fn engine_basic() {
let mut engine: RemoteEngine<RemoteEntity> = RemoteEngine::new(HostType::Server);
let entity = RemoteEntity::new(1);
let comp = component_kind::<1>();
engine.receive_message(1, EntityMessage::Spawn(entity));
engine.receive_message(2, EntityMessage::InsertComponent(entity, comp));
engine.receive_message(3, EntityMessage::RemoveComponent(entity, comp));
engine.receive_message(4, EntityMessage::Despawn(entity));
let mut asserts = AssertList::new();
asserts.push(EntityMessage::Spawn(entity));
asserts.push(EntityMessage::InsertComponent(entity, comp));
asserts.push(EntityMessage::RemoveComponent(entity, comp));
asserts.push(EntityMessage::Despawn(entity));
asserts.check(&mut engine);
}
#[test]
fn engine_entity_channels_do_not_block() {
let mut engine: RemoteEngine<RemoteEntity> = RemoteEngine::new(HostType::Server);
let entity_a = RemoteEntity::new(1);
let entity_b = RemoteEntity::new(2);
let entity_c = RemoteEntity::new(3);
engine.receive_message(3, EntityMessage::Spawn(entity_a));
engine.receive_message(2, EntityMessage::Spawn(entity_b));
engine.receive_message(1, EntityMessage::Spawn(entity_c));
let mut asserts = AssertList::new();
asserts.push(EntityMessage::Spawn(entity_a));
asserts.push(EntityMessage::Spawn(entity_b));
asserts.push(EntityMessage::Spawn(entity_c));
asserts.check(&mut engine);
}
#[test]
fn engine_component_channels_do_not_block() {
let mut engine: RemoteEngine<RemoteEntity> = RemoteEngine::new(HostType::Server);
let entity = RemoteEntity::new(1);
let comp_a = component_kind::<1>();
let comp_b = component_kind::<2>();
let comp_c = component_kind::<3>();
engine.receive_message(1, EntityMessage::Spawn(entity));
engine.receive_message(4, EntityMessage::InsertComponent(entity, comp_a));
engine.receive_message(3, EntityMessage::InsertComponent(entity, comp_b));
engine.receive_message(2, EntityMessage::InsertComponent(entity, comp_c));
let mut asserts = AssertList::new();
asserts.push(EntityMessage::Spawn(entity));
asserts.push(EntityMessage::InsertComponent(entity, comp_a));
asserts.push(EntityMessage::InsertComponent(entity, comp_b));
asserts.push(EntityMessage::InsertComponent(entity, comp_c));
asserts.check(&mut engine);
}
#[test]
fn wrap_ordering_simple() {
let mut engine: RemoteEngine<RemoteEntity> = RemoteEngine::new(HostType::Server);
let entity = RemoteEntity::new(1);
let comp = component_kind::<1>();
engine.receive_message(65_534, EntityMessage::Spawn(entity));
engine.receive_message(0, EntityMessage::InsertComponent(entity, comp));
let mut asserts = AssertList::new();
asserts.push(EntityMessage::Spawn(entity));
asserts.push(EntityMessage::InsertComponent(entity, comp));
asserts.check(&mut engine);
}
#[test]
fn guard_band_flush() {
let mut engine: RemoteEngine<RemoteEntity> = RemoteEngine::new(HostType::Server);
let entity = RemoteEntity::new(1);
let near_flush_seq = engine.config.flush_threshold - 2;
let wrap_beyond_seq = engine.config.flush_threshold + 1;
engine.receive_message(near_flush_seq, EntityMessage::Spawn(entity));
engine.receive_message(wrap_beyond_seq, EntityMessage::Spawn(entity));
let mut asserts = AssertList::new();
asserts.push(EntityMessage::Spawn(entity));
asserts.check(&mut engine);
}
#[test]
fn noop_safe() {
let mut engine: RemoteEngine<RemoteEntity> = RemoteEngine::new(HostType::Server);
engine.receive_message(10, EntityMessage::Noop);
let asserts = AssertList::new();
asserts.check(&mut engine);
}
#[test]
fn backlog_drains_on_prereq_arrival() {
let mut engine: RemoteEngine<RemoteEntity> = RemoteEngine::new(HostType::Server);
let entity = RemoteEntity::new(1);
let comp = component_kind::<1>();
engine.receive_message(6, EntityMessage::InsertComponent(entity, comp));
engine.receive_message(5, EntityMessage::Spawn(entity));
let mut asserts = AssertList::new();
asserts.push(EntityMessage::Spawn(entity));
asserts.push(EntityMessage::InsertComponent(entity, comp));
asserts.check(&mut engine);
}
#[test]
fn entity_despawn_before_spawn() {
let mut engine: RemoteEngine<RemoteEntity> = RemoteEngine::new(HostType::Server);
let entity = RemoteEntity::new(1);
let comp = component_kind::<1>();
engine.receive_message(3, EntityMessage::Despawn(entity));
engine.receive_message(2, EntityMessage::InsertComponent(entity, comp));
engine.receive_message(1, EntityMessage::Spawn(entity));
let mut asserts = AssertList::new();
asserts.push(EntityMessage::Spawn(entity));
asserts.push(EntityMessage::InsertComponent(entity, comp));
asserts.push(EntityMessage::Despawn(entity));
asserts.check(&mut engine);
}
#[test]
fn component_remove_before_insert() {
let mut engine: RemoteEngine<RemoteEntity> = RemoteEngine::new(HostType::Server);
let entity = RemoteEntity::new(1);
let comp = component_kind::<1>();
engine.receive_message(1, EntityMessage::Spawn(entity));
engine.receive_message(3, EntityMessage::RemoveComponent(entity, comp));
engine.receive_message(2, EntityMessage::InsertComponent(entity, comp));
let mut asserts = AssertList::new();
asserts.push(EntityMessage::Spawn(entity));
asserts.push(EntityMessage::InsertComponent(entity, comp));
asserts.push(EntityMessage::RemoveComponent(entity, comp));
asserts.check(&mut engine);
}
#[test]
fn empty_drain_safe() {
let mut engine: RemoteEngine<RemoteEntity> = RemoteEngine::new(HostType::Server);
let out1 = engine.take_incoming_events();
assert!(out1.is_empty());
let out2 = engine.take_incoming_events();
assert!(out2.is_empty());
}
#[test]
#[ignore]
fn entity_auth_basic() {
let mut engine: RemoteEngine<RemoteEntity> = RemoteEngine::new(HostType::Server);
let entity = RemoteEntity::new(1);
engine.receive_message(1, EntityMessage::Spawn(entity));
engine.receive_message(2, EntityMessage::Publish(1, entity));
engine.receive_message(3, EntityMessage::EnableDelegation(1, entity));
engine.receive_message(
4,
EntityMessage::SetAuthority(1, entity, EntityAuthStatus::Granted),
);
engine.receive_message(
5,
EntityMessage::SetAuthority(1, entity, EntityAuthStatus::Available),
);
engine.receive_message(6, EntityMessage::DisableDelegation(1, entity));
engine.receive_message(7, EntityMessage::Unpublish(1, entity));
engine.receive_message(8, EntityMessage::Despawn(entity));
let mut asserts = AssertList::new();
asserts.push(EntityMessage::Spawn(entity));
asserts.push(EntityMessage::Publish(1, entity));
asserts.push(EntityMessage::EnableDelegation(1, entity));
asserts.push(EntityMessage::SetAuthority(
1,
entity,
EntityAuthStatus::Granted,
));
asserts.push(EntityMessage::SetAuthority(
1,
entity,
EntityAuthStatus::Available,
));
asserts.push(EntityMessage::DisableDelegation(1, entity));
asserts.push(EntityMessage::Unpublish(1, entity));
asserts.push(EntityMessage::Despawn(entity));
asserts.check(&mut engine);
}
#[test]
#[ignore]
fn entity_auth_scrambled() {
let mut engine: RemoteEngine<RemoteEntity> = RemoteEngine::new(HostType::Server);
let entity = RemoteEntity::new(1);
engine.receive_message(8, EntityMessage::Despawn(entity));
engine.receive_message(6, EntityMessage::DisableDelegation(5, entity)); engine.receive_message(
4,
EntityMessage::SetAuthority(3, entity, EntityAuthStatus::Granted),
); engine.receive_message(2, EntityMessage::Publish(1, entity));
engine.receive_message(1, EntityMessage::Spawn(entity));
engine.receive_message(3, EntityMessage::EnableDelegation(2, entity)); engine.receive_message(
5,
EntityMessage::SetAuthority(3, entity, EntityAuthStatus::Available),
); engine.receive_message(7, EntityMessage::Unpublish(4, entity));
let mut asserts = AssertList::new();
asserts.push(EntityMessage::Spawn(entity));
asserts.push(EntityMessage::Publish(1, entity));
asserts.push(EntityMessage::Despawn(entity));
asserts.check(&mut engine);
}
#[test]
fn despawn_clears_stale_buffers() {
let mut engine: RemoteEngine<RemoteEntity> = RemoteEngine::new(HostType::Server);
let entity = RemoteEntity::new(1);
let comp_a = component_kind::<1>();
let comp_b = component_kind::<2>();
engine.receive_message(1, EntityMessage::Spawn(entity));
engine.receive_message(2, EntityMessage::InsertComponent(entity, comp_a));
engine.receive_message(4, EntityMessage::Despawn(entity));
engine.receive_message(3, EntityMessage::InsertComponent(entity, comp_b));
engine.receive_message(5, EntityMessage::Spawn(entity));
let mut asserts = AssertList::new();
asserts.push(EntityMessage::Spawn(entity));
asserts.push(EntityMessage::InsertComponent(entity, comp_a));
asserts.push(EntityMessage::Despawn(entity));
asserts.push(EntityMessage::Spawn(entity)); asserts.check(&mut engine);
}
#[test]
fn component_dense_toggle_sequence() {
let mut engine: RemoteEngine<RemoteEntity> = RemoteEngine::new(HostType::Server);
let entity = RemoteEntity::new(1);
let comp = component_kind::<1>();
engine.receive_message(1, EntityMessage::Spawn(entity));
engine.receive_message(10, EntityMessage::InsertComponent(entity, comp)); engine.receive_message(13, EntityMessage::RemoveComponent(entity, comp)); engine.receive_message(12, EntityMessage::InsertComponent(entity, comp)); engine.receive_message(11, EntityMessage::RemoveComponent(entity, comp)); engine.receive_message(14, EntityMessage::InsertComponent(entity, comp));
let mut asserts = AssertList::new();
asserts.push(EntityMessage::Spawn(entity));
asserts.push(EntityMessage::InsertComponent(entity, comp));
asserts.push(EntityMessage::RemoveComponent(entity, comp));
asserts.push(EntityMessage::InsertComponent(entity, comp));
asserts.check(&mut engine);
}
#[test]
fn component_backlog_on_entity_a_does_not_block_entity_b() {
let mut engine: RemoteEngine<RemoteEntity> = RemoteEngine::new(HostType::Server);
let entity_a = RemoteEntity::new(1);
let entity_b = RemoteEntity::new(2);
let comp_a = component_kind::<1>();
engine.receive_message(2, EntityMessage::InsertComponent(entity_a, comp_a));
engine.receive_message(3, EntityMessage::Spawn(entity_b));
let mut asserts = AssertList::new();
asserts.push(EntityMessage::Spawn(entity_b));
asserts.check(&mut engine);
engine.receive_message(1, EntityMessage::Spawn(entity_a));
let mut asserts = AssertList::new();
asserts.push(EntityMessage::Spawn(entity_a));
asserts.push(EntityMessage::InsertComponent(entity_a, comp_a));
asserts.check(&mut engine);
}
#[test]
#[ignore]
fn entity_auth_illegal_disable_delegation_dropped() {
let mut engine: RemoteEngine<RemoteEntity> = RemoteEngine::new(HostType::Server);
let entity = RemoteEntity::new(1);
engine.receive_message(1, EntityMessage::Spawn(entity));
engine.receive_message(2, EntityMessage::Publish(1, entity));
engine.receive_message(4, EntityMessage::DisableDelegation(1, entity));
engine.receive_message(5, EntityMessage::Despawn(entity));
let mut asserts = AssertList::new();
asserts.push(EntityMessage::Spawn(entity));
asserts.push(EntityMessage::Publish(1, entity));
asserts.push(EntityMessage::Despawn(entity));
asserts.check(&mut engine);
}
#[test]
#[ignore]
fn entity_auth_illegal_update_authority_dropped() {
let mut engine: RemoteEngine<RemoteEntity> = RemoteEngine::new(HostType::Server);
let entity = RemoteEntity::new(1);
engine.receive_message(1, EntityMessage::Spawn(entity));
engine.receive_message(2, EntityMessage::Publish(1, entity));
engine.receive_message(
4,
EntityMessage::SetAuthority(1, entity, EntityAuthStatus::Granted),
);
engine.receive_message(5, EntityMessage::Despawn(entity));
let mut asserts = AssertList::new();
asserts.push(EntityMessage::Spawn(entity));
asserts.push(EntityMessage::Publish(1, entity));
asserts.push(EntityMessage::Despawn(entity));
asserts.check(&mut engine);
}
#[test]
#[ignore]
fn entity_auth_illegal_unpublish_while_delegated_dropped() {
let mut engine: RemoteEngine<RemoteEntity> = RemoteEngine::new(HostType::Server);
let entity = RemoteEntity::new(1);
engine.receive_message(1, EntityMessage::Spawn(entity));
engine.receive_message(2, EntityMessage::Publish(1, entity));
engine.receive_message(3, EntityMessage::EnableDelegation(1, entity));
engine.receive_message(5, EntityMessage::Unpublish(1, entity));
engine.receive_message(4, EntityMessage::DisableDelegation(1, entity));
engine.receive_message(6, EntityMessage::Despawn(entity));
let mut asserts = AssertList::new();
asserts.push(EntityMessage::Spawn(entity));
asserts.push(EntityMessage::Publish(1, entity));
asserts.push(EntityMessage::EnableDelegation(1, entity));
asserts.push(EntityMessage::DisableDelegation(1, entity));
asserts.push(EntityMessage::Unpublish(1, entity));
asserts.push(EntityMessage::Despawn(entity));
asserts.check(&mut engine);
}
#[test]
#[ignore]
fn entity_auth_illegal_enable_delegation_while_already_delegated_dropped() {
let mut engine: RemoteEngine<RemoteEntity> = RemoteEngine::new(HostType::Server);
let entity = RemoteEntity::new(1);
engine.receive_message(1, EntityMessage::Spawn(entity));
engine.receive_message(2, EntityMessage::Publish(1, entity));
engine.receive_message(3, EntityMessage::EnableDelegation(1, entity));
engine.receive_message(5, EntityMessage::EnableDelegation(1, entity));
engine.receive_message(4, EntityMessage::DisableDelegation(1, entity));
engine.receive_message(6, EntityMessage::Despawn(entity));
let mut asserts = AssertList::new();
asserts.push(EntityMessage::Spawn(entity));
asserts.push(EntityMessage::Publish(1, entity));
asserts.push(EntityMessage::EnableDelegation(1, entity));
asserts.push(EntityMessage::DisableDelegation(1, entity));
asserts.push(EntityMessage::EnableDelegation(1, entity));
asserts.push(EntityMessage::Despawn(entity));
asserts.check(&mut engine);
}
#[test]
#[ignore]
fn entity_auth_illegal_publish_while_already_published_dropped() {
let mut engine: RemoteEngine<RemoteEntity> = RemoteEngine::new(HostType::Server);
let entity = RemoteEntity::new(1);
engine.receive_message(1, EntityMessage::Spawn(entity));
engine.receive_message(2, EntityMessage::Publish(1, entity));
engine.receive_message(6, EntityMessage::Publish(1, entity));
engine.receive_message(4, EntityMessage::Despawn(entity));
let mut asserts = AssertList::new();
asserts.push(EntityMessage::Spawn(entity));
asserts.push(EntityMessage::Publish(1, entity));
asserts.push(EntityMessage::Despawn(entity));
asserts.check(&mut engine);
}
#[test]
#[ignore]
fn entity_auth_illegal_disable_delegation_while_unpublished_dropped() {
let mut engine: RemoteEngine<RemoteEntity> = RemoteEngine::new(HostType::Server);
let entity = RemoteEntity::new(1);
engine.receive_message(1, EntityMessage::Spawn(entity));
engine.receive_message(2, EntityMessage::Publish(1, entity));
engine.receive_message(3, EntityMessage::Unpublish(1, entity));
engine.receive_message(6, EntityMessage::DisableDelegation(1, entity));
engine.receive_message(7, EntityMessage::Despawn(entity));
let mut asserts = AssertList::new();
asserts.push(EntityMessage::Spawn(entity));
asserts.push(EntityMessage::Publish(1, entity));
asserts.push(EntityMessage::Unpublish(1, entity));
asserts.push(EntityMessage::Despawn(entity));
asserts.check(&mut engine);
}
#[test]
#[ignore]
fn entity_auth_publish_unpublish_cycle() {
let mut engine: RemoteEngine<RemoteEntity> = RemoteEngine::new(HostType::Server);
let entity = RemoteEntity::new(1);
engine.receive_message(1, EntityMessage::Spawn(entity));
engine.receive_message(2, EntityMessage::Publish(1, entity));
engine.receive_message(3, EntityMessage::Unpublish(1, entity));
engine.receive_message(4, EntityMessage::Publish(1, entity));
let mut asserts = AssertList::new();
asserts.push(EntityMessage::Spawn(entity));
asserts.push(EntityMessage::Publish(1, entity));
asserts.push(EntityMessage::Unpublish(1, entity));
asserts.push(EntityMessage::Publish(1, entity));
asserts.check(&mut engine);
}
#[test]
fn cross_entity_guard_band() {
let mut engine: RemoteEngine<RemoteEntity> = RemoteEngine::new(HostType::Server);
let entity_a = RemoteEntity::new(1);
let entity_b = RemoteEntity::new(2);
let near_flush_seq = engine.config.flush_threshold - 1;
let low_seq = 10;
engine.receive_message(near_flush_seq, EntityMessage::Spawn(entity_a));
engine.receive_message(low_seq, EntityMessage::Spawn(entity_b));
let mut asserts = AssertList::new();
asserts.push(EntityMessage::Spawn(entity_a));
asserts.push(EntityMessage::Spawn(entity_b));
asserts.check(&mut engine);
}
#[test]
#[should_panic]
fn duplicate_message_id_panics() {
let mut engine: RemoteEngine<RemoteEntity> = RemoteEngine::new(HostType::Server);
let entity = RemoteEntity::new(1);
engine.receive_message(1, EntityMessage::Spawn(entity));
engine.receive_message(1, EntityMessage::Spawn(entity));
}
#[test]
fn max_in_flight_overlap_dropped() {
let mut engine: RemoteEngine<RemoteEntity> = RemoteEngine::new(HostType::Server);
let entity = RemoteEntity::new(1);
let comp = component_kind::<1>();
engine.receive_message(1, EntityMessage::Spawn(entity));
let overlapping_id: u16 = engine.config.max_in_flight.wrapping_add(1).wrapping_add(1);
engine.receive_message(overlapping_id, EntityMessage::InsertComponent(entity, comp));
engine.receive_message(2, EntityMessage::InsertComponent(entity, comp));
let mut asserts = AssertList::new();
asserts.push(EntityMessage::Spawn(entity));
asserts.push(EntityMessage::InsertComponent(entity, comp)); asserts.check(&mut engine);
}
#[test]
#[ignore]
fn component_survives_delegation_cycle() {
let mut engine: RemoteEngine<RemoteEntity> = RemoteEngine::new(HostType::Server);
let entity = RemoteEntity::new(1);
let comp = component_kind::<1>();
engine.receive_message(1, EntityMessage::Spawn(entity));
engine.receive_message(2, EntityMessage::Publish(1, entity));
engine.receive_message(3, EntityMessage::EnableDelegation(1, entity));
engine.receive_message(4, EntityMessage::InsertComponent(entity, comp)); engine.receive_message(5, EntityMessage::DisableDelegation(1, entity)); engine.receive_message(6, EntityMessage::RemoveComponent(entity, comp)); engine.receive_message(7, EntityMessage::Unpublish(1, entity));
let mut asserts = AssertList::new();
asserts.push(EntityMessage::Spawn(entity));
asserts.push(EntityMessage::Publish(1, entity));
asserts.push(EntityMessage::EnableDelegation(1, entity));
asserts.push(EntityMessage::InsertComponent(entity, comp));
asserts.push(EntityMessage::DisableDelegation(1, entity));
asserts.push(EntityMessage::RemoveComponent(entity, comp));
asserts.push(EntityMessage::Unpublish(1, entity));
asserts.check(&mut engine);
}
#[test]
#[ignore]
fn despawn_resets_auth_buffers() {
let mut engine: RemoteEngine<RemoteEntity> = RemoteEngine::new(HostType::Server);
let entity = RemoteEntity::new(1);
engine.receive_message(1, EntityMessage::Spawn(entity));
engine.receive_message(2, EntityMessage::Publish(1, entity));
engine.receive_message(3, EntityMessage::Despawn(entity));
engine.receive_message(5, EntityMessage::Publish(1, entity));
engine.receive_message(7, EntityMessage::Spawn(entity));
let mut asserts = AssertList::new();
asserts.push(EntityMessage::Spawn(entity)); asserts.push(EntityMessage::Publish(1, entity));
asserts.push(EntityMessage::Despawn(entity));
asserts.push(EntityMessage::Spawn(entity)); asserts.check(&mut engine); }
#[test]
fn component_backlog_isolation() {
let mut engine: RemoteEngine<RemoteEntity> = RemoteEngine::new(HostType::Server);
let entity = RemoteEntity::new(1);
let comp_a = component_kind::<1>(); let comp_b = component_kind::<2>();
engine.receive_message(1, EntityMessage::Spawn(entity));
engine.receive_message(3, EntityMessage::RemoveComponent(entity, comp_a));
engine.receive_message(4, EntityMessage::InsertComponent(entity, comp_b));
let mut asserts = AssertList::new();
asserts.push(EntityMessage::Spawn(entity));
asserts.push(EntityMessage::InsertComponent(entity, comp_b));
asserts.check(&mut engine);
engine.receive_message(2, EntityMessage::InsertComponent(entity, comp_a));
let mut asserts = AssertList::new();
asserts.push(EntityMessage::InsertComponent(entity, comp_a));
asserts.push(EntityMessage::RemoveComponent(entity, comp_a));
asserts.check(&mut engine);
}
#[test]
fn component_idempotent_duplicate_drops() {
let mut engine: RemoteEngine<RemoteEntity> = RemoteEngine::new(HostType::Server);
let entity = RemoteEntity::new(1);
let comp = component_kind::<1>();
engine.receive_message(5, EntityMessage::Spawn(entity));
engine.receive_message(6, EntityMessage::InsertComponent(entity, comp));
engine.receive_message(1, EntityMessage::InsertComponent(entity, comp));
engine.receive_message(7, EntityMessage::RemoveComponent(entity, comp));
engine.receive_message(3, EntityMessage::RemoveComponent(entity, comp));
let mut asserts = AssertList::new();
asserts.push(EntityMessage::Spawn(entity));
asserts.push(EntityMessage::InsertComponent(entity, comp));
asserts.push(EntityMessage::RemoveComponent(entity, comp));
asserts.check(&mut engine);
}
#[test]
fn large_burst_at_max_in_flight() {
let mut engine: RemoteEngine<RemoteEntity> = RemoteEngine::new(HostType::Server);
engine.config = EngineConfig {
max_in_flight: 15, flush_threshold: 65521,
};
let entity = RemoteEntity::new(99);
let comp = component_kind::<1>();
engine.receive_message(1, EntityMessage::Spawn(entity));
for i in 0..engine.config.max_in_flight {
let id = 2 + i;
let msg = if i % 2 == 0 {
EntityMessage::InsertComponent(entity, comp)
} else {
EntityMessage::RemoveComponent(entity, comp)
};
engine.receive_message(id, msg);
}
let mut asserts = AssertList::new();
asserts.push(EntityMessage::Spawn(entity));
for i in 0..engine.config.max_in_flight {
if i % 2 == 0 {
asserts.push(EntityMessage::InsertComponent(entity, comp));
} else {
asserts.push(EntityMessage::RemoveComponent(entity, comp));
}
}
asserts.check(&mut engine);
}
#[test]
fn auth_messages_buffer_until_spawn_epoch() {
let mut engine: RemoteEngine<RemoteEntity> = RemoteEngine::new(HostType::Server);
let entity = RemoteEntity::new(1);
engine.receive_message(
1,
EntityMessage::SetAuthority(0, entity, EntityAuthStatus::Granted),
);
let events = engine.take_incoming_events();
assert_eq!(
events.len(),
0,
"Auth messages should not be emitted before Spawn"
);
engine.receive_message(0, EntityMessage::Spawn(entity));
let mut asserts = AssertList::new();
asserts.push(EntityMessage::Spawn(entity));
asserts.push(EntityMessage::SetAuthority(
0,
entity,
EntityAuthStatus::Granted,
));
asserts.check(&mut engine);
}