#![cfg(feature = "multiplayer")]
use super::protocol::{AuthorityClient, AuthorityEvent, ConnectionState};
use dreamwell_fabric::packets::ClientIntent;
pub struct RemoteAuthority {
state: ConnectionState,
next_seq: u64,
pending_events: Vec<AuthorityEvent>,
}
impl RemoteAuthority {
pub fn new() -> Self {
Self {
state: ConnectionState::Connecting,
next_seq: 0,
pending_events: Vec::new(),
}
}
pub fn simulate_connected(&mut self) {
self.state = ConnectionState::Connected;
}
}
impl Default for RemoteAuthority {
fn default() -> Self {
Self::new()
}
}
impl AuthorityClient for RemoteAuthority {
fn submit_intents(&mut self, intents: &[ClientIntent]) {
for _intent in intents {
self.pending_events.push(AuthorityEvent::Ack { seq: self.next_seq });
self.next_seq += 1;
}
}
fn poll_events(&mut self, out: &mut Vec<AuthorityEvent>) {
out.append(&mut self.pending_events);
}
fn request_snapshot(&mut self) {
self.pending_events.push(AuthorityEvent::SnapshotChunk {
chunk_id: 0,
total_chunks: 1,
data: Vec::new(),
});
}
fn connection_state(&self) -> ConnectionState {
self.state
}
}
#[cfg(test)]
mod tests {
use super::*;
use crate::authority::protocol::ConnectionState;
#[test]
fn starts_connecting() {
let ra = RemoteAuthority::new();
assert_eq!(ra.connection_state(), ConnectionState::Connecting);
}
#[test]
fn simulate_connected() {
let mut ra = RemoteAuthority::new();
ra.simulate_connected();
assert_eq!(ra.connection_state(), ConnectionState::Connected);
}
#[test]
fn submit_and_poll() {
let mut ra = RemoteAuthority::new();
ra.submit_intents(&[ClientIntent {
actor_id: 1,
tick_hint: 0,
action: dreamwell_fabric::packets::IntentKind::Move { dx: 1, dy: 0 },
}]);
let mut events = Vec::new();
ra.poll_events(&mut events);
assert_eq!(events.len(), 1);
assert!(matches!(events[0], AuthorityEvent::Ack { seq: 0 }));
}
#[test]
fn request_snapshot_returns_chunk() {
let mut ra = RemoteAuthority::new();
ra.request_snapshot();
let mut events = Vec::new();
ra.poll_events(&mut events);
assert_eq!(events.len(), 1);
assert!(matches!(
events[0],
AuthorityEvent::SnapshotChunk {
chunk_id: 0,
total_chunks: 1,
..
}
));
}
}