use bevy::prelude::*;
use crate::prelude::*;
pub trait ServerTestAppExt {
fn connect_client(&mut self, client_app: &mut App);
fn disconnect_client(&mut self, client_app: &mut App);
fn exchange_with_client(&mut self, client_app: &mut App);
}
impl ServerTestAppExt for App {
fn connect_client(&mut self, client_app: &mut App) {
self.world_mut()
.resource_mut::<NextState<ServerState>>()
.as_mut()
.set_if_neq(ServerState::Running);
let client_entity = self
.world_mut()
.spawn(ConnectedClient { max_size: 1200 })
.id();
assert_eq!(
*client_app.world().resource::<State<ClientState>>(),
ClientState::Disconnected,
"client can't be connected multiple times"
);
client_app
.world_mut()
.resource_mut::<NextState<ClientState>>()
.as_mut()
.set_if_neq(ClientState::Connected);
client_app
.world_mut()
.insert_resource(TestClientEntity(client_entity));
client_app.update();
self.exchange_with_client(client_app);
self.update();
self.exchange_with_client(client_app);
client_app.update();
}
fn disconnect_client(&mut self, client_app: &mut App) {
client_app
.world_mut()
.resource_mut::<NextState<ClientState>>()
.as_mut()
.set_if_neq(ClientState::Disconnected);
let client_entity = *client_app
.world_mut()
.remove_resource::<TestClientEntity>()
.expect("client should have an assigned ID for disconnect");
self.world_mut().despawn(client_entity);
self.update();
client_app.update();
}
fn exchange_with_client(&mut self, client_app: &mut App) {
let client_entity = **client_app.world().resource::<TestClientEntity>();
let mut client_messages = client_app.world_mut().resource_mut::<ClientMessages>();
let mut server_messages = self.world_mut().resource_mut::<ServerMessages>();
for (channel_id, message) in client_messages.drain_sent() {
server_messages.insert_received(client_entity, channel_id, message)
}
server_messages.retain_sent(|(entity, channel_id, message)| {
if *entity == client_entity {
client_messages.insert_received(*channel_id, message.clone());
false
} else {
true
}
})
}
}
#[derive(Resource, Deref, Debug, Clone, Copy)]
pub struct TestClientEntity(Entity);