Implement message types and lobby join

This commit is contained in:
bel
2020-05-03 08:14:29 -06:00
parent 8971426dcd
commit 247e29ce13
9 changed files with 270 additions and 7 deletions

View File

@@ -1,3 +1,4 @@
/*
use super::super::super::model::state::room::Room;
pub struct GameMaster {
@@ -10,6 +11,24 @@ impl GameMaster {
room: room,
}
}
fn run(&self) -> Result<String, String> {
self.run_lobby()?;
self.run_game_setup()?;
self.run_game()
}
fn run_lobby(&self) -> Result<String, String> {
Err("not impl".to_string())
}
fn run_game_setup(&self) -> Result<String, String> {
Err("not impl".to_string())
}
fn run_game(&self) -> Result<String, String> {
Err("not impl".to_string())
}
}
#[cfg(test)]
@@ -36,11 +55,29 @@ mod tests {
let _ = GameMaster::new(r);
}
#[test]
fn new_mockrooms() {
let mut mrs = MockRooms::new();
let r = mrs.create();
let _ = GameMaster::new(r);
}
#[test]
fn gm_run_lobby_fail() {
let gm = GameMaster::new(Box::new(MockRoom::create()));
panic!("not impl");
}
#[test]
fn gm_run_game_setup_fail() {
let gm = GameMaster::new(Box::new(MockRoom::create()));
panic!("not impl");
}
#[test]
fn gm_run_game_fail() {
let gm = GameMaster::new(Box::new(MockRoom::create()));
panic!("not impl");
}
}
*/

View File

@@ -0,0 +1,70 @@
use super::player::Player;
use super::super::super::model::state::event::Event;
use std::collections::HashMap;
pub struct Lobby {
players: HashMap<String, Player>,
}
impl Lobby {
fn new() -> Lobby {
Lobby{
players: HashMap::new(),
}
}
fn eat(&mut self, message: Event) {
let j = message.join();
if j.is_none() {
return;
}
let id = j.unwrap();
self.players.insert(id.clone(), Player::new(id));
}
}
#[cfg(test)]
mod tests {
use super::*;
fn _dummy_event(m: &str) -> Event {
Event{
body: m.to_string(),
next: "a".to_string(),
sender: "b".to_string(),
}
}
#[test]
fn new_lobby() {
let _ = Lobby::new();
}
#[test]
fn eat_join() {
let mut l = Lobby::new();
let e = _dummy_event(r#"{"membership": "join", "displayname": "a"}"#);
let was = l.players.len();
l.eat(e);
assert!(was+1 == l.players.len(), "want {}, got {}: {:?}", was+1, l.players.len(), l.players);
}
#[test]
fn eat_join_malformatted() {
let mut l = Lobby::new();
let e = _dummy_event(r#"{"membership": "join"}"#);
let was = l.players.len();
l.eat(e);
assert!(was == l.players.len());
}
#[test]
fn eat_null() {
let mut l = Lobby::new();
let e = _dummy_event(r#"{"hello": "world"}"#);
let was = l.players.len();
l.eat(e);
assert!(was == l.players.len());
}
}

View File

@@ -1 +1,3 @@
pub mod gamemaster;
pub mod player;
pub mod lobby;

View File

@@ -0,0 +1,22 @@
#[derive(Clone, Debug)]
pub struct Player {
id: String,
}
impl Player {
pub fn new(id: String) -> Player {
Player {
id: id,
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn new_player() {
let _ = Player::new("id".to_string());
}
}