From a277e4079c4009fffab50feef1454cf4ea845367 Mon Sep 17 00:00:00 2001 From: bel Date: Wed, 6 May 2020 21:19:17 -0600 Subject: [PATCH] run chancellor selection --- .../src/controller/gamemaster/gameevent.rs | 22 +++--- .../controller/gamemaster/gamemaster/game.rs | 79 ++++++++++++++++++- .../gamemaster/gamemaster/gamemaster.rs | 19 ++++- .../controller/gamemaster/gamemaster/setup.rs | 3 - 4 files changed, 108 insertions(+), 15 deletions(-) diff --git a/secert-hitler/src/controller/gamemaster/gameevent.rs b/secert-hitler/src/controller/gamemaster/gameevent.rs index 2e95830..802dd1a 100644 --- a/secert-hitler/src/controller/gamemaster/gameevent.rs +++ b/secert-hitler/src/controller/gamemaster/gameevent.rs @@ -125,10 +125,14 @@ impl GameEvent { pub fn serialize(&self) -> String { (json::object!{ - GameEventType: format!("{:?}", self.mode()), - sources: self.sources(), - targets: self.targets(), - params: self.params(), + body: json::stringify(json::object!{ + GameEventType: format!("{:?}", self.mode()), + sources: self.sources(), + targets: self.targets(), + params: self.params(), + }), + sender: "__gm__", + msgtype: "m.text".to_string(), }).dump() } } @@ -246,31 +250,31 @@ mod tests { d: json::object!{}, sender: "a".to_string(), }; - assert!(ge.serialize() == r#"{"GameEventType":"Null","sources":[],"targets":[],"params":[]}"#, "{}", ge.serialize()); + assert!(ge.serialize() == r#"{"body":"{\"GameEventType\":\"Null\",\"sources\":[],\"targets\":[],\"params\":[]}","sender":"__gm__","msgtype":"m.text"}"#, "{}", ge.serialize()); let ge = GameEvent{ d: json::object!{GameEventType: "GameStart"}, sender: "a".to_string(), }; - assert!(ge.serialize() == r#"{"GameEventType":"GameStart","sources":[],"targets":[],"params":[]}"#, "{}", ge.serialize()); + assert!(ge.serialize() == r#"{"body":"{\"GameEventType\":\"GameStart\",\"sources\":[],\"targets\":[],\"params\":[]}","sender":"__gm__","msgtype":"m.text"}"#, "{}", ge.serialize()); let ge = GameEvent{ d: json::object!{GameEventType: "GameStart", params: ["hi"]}, sender: "a".to_string(), }; - assert!(ge.serialize() == r#"{"GameEventType":"GameStart","sources":[],"targets":[],"params":["hi"]}"#, "{}", ge.serialize()); + assert!(ge.serialize() == r#"{"body":"{\"GameEventType\":\"GameStart\",\"sources\":[],\"targets\":[],\"params\":[\"hi\"]}","sender":"__gm__","msgtype":"m.text"}"#, "{}", ge.serialize()); let ge = GameEvent{ d: json::object!{GameEventType: "GameStart", sources: ["hi"], targets: ["hi2"]}, sender: "a".to_string(), }; - assert!(ge.serialize() == r#"{"GameEventType":"GameStart","sources":["hi"],"targets":["hi2"],"params":[]}"#, "{}", ge.serialize()); + assert!(ge.serialize() == r#"{"body":"{\"GameEventType\":\"GameStart\",\"sources\":[\"hi\"],\"targets\":[\"hi2\"],\"params\":[]}","sender":"__gm__","msgtype":"m.text"}"#, "{}", ge.serialize()); let ge = GameEvent{ d: json::object!{GameEventType: "Null", sources: ["hi"], targets: ["hi2"]}, sender: "a".to_string(), }; - assert!(ge.serialize() == r#"{"GameEventType":"Null","sources":["hi"],"targets":["hi2"],"params":[]}"#, "{}", ge.serialize()); + assert!(ge.serialize() == r#"{"body":"{\"GameEventType\":\"Null\",\"sources\":[\"hi\"],\"targets\":[\"hi2\"],\"params\":[]}","sender":"__gm__","msgtype":"m.text"}"#, "{}", ge.serialize()); debug!("sample gameevent serialize: {}", ge.serialize()); } } diff --git a/secert-hitler/src/controller/gamemaster/gamemaster/game.rs b/secert-hitler/src/controller/gamemaster/gamemaster/game.rs index 434b2b5..f7348b1 100644 --- a/secert-hitler/src/controller/gamemaster/gamemaster/game.rs +++ b/secert-hitler/src/controller/gamemaster/gamemaster/game.rs @@ -3,8 +3,8 @@ use super::super::gameevent::GameEvent; use super::super::gameevent::GameEventType; use super::super::policy::Policy; use super::super::role::Role; -use super::super::player::Player; +use log::debug; use json; impl GameMaster { @@ -35,7 +35,22 @@ impl GameMaster { if self.room.send(ge.serialize()).is_err() { return Err(Role::Null); } - Err(Role::Null) + let events = self.scrape_until_gameeventtype(GameEventType::ElectionSet); + if events.is_err() { + return Err(Role::Null); + } + let events = events.unwrap(); + let chancellor_candidate_event = GameEvent::new(events.last().unwrap().clone()); + let chancellor_candidate = chancellor_candidate_event.targets(); + if chancellor_candidate.len() == 0 { + debug!("no chancellor candidates found in election set"); + return self.game_election(); + } + if self.player(chancellor_candidate.last().unwrap().clone()).is_none() { + debug!("invalid chancellor candidates found in election set"); + return self.game_election(); + } + Ok(chancellor_candidate_event) } pub fn game_election_vote(&mut self) -> Result { @@ -71,6 +86,7 @@ mod tests { use super::super::super::super::super::config; use log::{debug, LevelFilter}; + use json; fn init() { let _ = env_logger::builder() @@ -158,4 +174,63 @@ mod tests { assert!(gm.game_is_over().is_err()); assert!(gm.game_is_over().err().unwrap() == Role::Facist); } + + #[test] + fn game_election() { + let mut gm = dummy(); + + debug!("sending a null event"); + let ge = GameEventType::Null.build(); + assert!(ge.mode() == GameEventType::Null); + assert!(gm.room.send(ge.serialize()).is_ok()); + debug!("sent: {}", ge.serialize()); + + debug!("sending an empty election set event"); + let ge = GameEventType::ElectionSet.build(); + assert!(ge.mode() == GameEventType::ElectionSet); + assert!(gm.room.send(ge.serialize()).is_ok()); + debug!("sent: {}", ge.serialize()); + + debug!("sending a params election set event"); + let mut ge = GameEventType::ElectionSet.build(); + assert!(ge.mode() == GameEventType::ElectionSet); + ge.d["params"] = json::array!["a"]; + assert!(gm.room.send(ge.serialize()).is_ok()); + debug!("sent: {}", ge.serialize()); + + debug!("sending a sources election set event"); + let mut ge = GameEventType::ElectionSet.build(); + assert!(ge.mode() == GameEventType::ElectionSet); + ge.d["sources"] = json::array!["b"]; + assert!(gm.room.send(ge.serialize()).is_ok()); + debug!("sent: {}", ge.serialize()); + + debug!("sending an empty targets election set event"); + let mut ge = GameEventType::ElectionSet.build(); + assert!(ge.mode() == GameEventType::ElectionSet); + ge.d["targets"] = json::array![]; + assert!(gm.room.send(ge.serialize()).is_ok()); + debug!("sent: {}", ge.serialize()); + + debug!("sending an invalid targets election set event"); + let mut ge = GameEventType::ElectionSet.build(); + assert!(ge.mode() == GameEventType::ElectionSet); + ge.d["targets"] = json::array!["abc"]; + assert!(gm.room.send(ge.serialize()).is_ok()); + debug!("sent: {}", ge.serialize()); + + debug!("sending a valid targets election set event"); + let mut ge = GameEventType::ElectionSet.build(); + assert!(ge.mode() == GameEventType::ElectionSet); + ge.d["targets"] = json::array!["realplayer"]; + assert!(gm.room.send(ge.serialize()).is_ok()); + debug!("sent: {}", ge.serialize()); + gm.lobby.players.insert("realplayer".to_string(), Player::new("realplayer".to_string())); + + debug!("running game election"); + assert!(gm.game_election().is_ok()); + + let election_pends = gm.room.sync(); + assert!(election_pends.len() == 6, "election_pends: {:?}", election_pends); + } } diff --git a/secert-hitler/src/controller/gamemaster/gamemaster/gamemaster.rs b/secert-hitler/src/controller/gamemaster/gamemaster/gamemaster.rs index 89e7726..d4db46c 100644 --- a/secert-hitler/src/controller/gamemaster/gamemaster/gamemaster.rs +++ b/secert-hitler/src/controller/gamemaster/gamemaster/gamemaster.rs @@ -96,8 +96,9 @@ impl GameMaster { for e in &events { scraped.push(e.clone()); let ge = GameEvent::new(e.clone()); - debug!("scrape_until {:?}: ge: {:?}", get, ge); + debug!("scrape_until {:?}: {:?}: ge: {:?}", get, ge.mode() == get, ge); if ge.mode() == get { + debug!("/scrape_until {:?}: {:?}: ge: {:?}", get, ge.mode() == get, ge); self.room.rollback(e.since.clone()); return Ok(scraped); } @@ -156,5 +157,21 @@ mod tests { let e = scraped.first().unwrap(); assert!(GameEvent::new(e.clone()).mode() == GameEventType::Null, "{:?}", e); assert!(gm.room.sync().len() == 0); + + r2.send(GameEventType::ElectionSet.build().serialize()).unwrap(); + r2.send(GameEventType::ElectionSet.build().serialize()).unwrap(); + let scraped = gm.scrape_until_gameeventtype(GameEventType::ElectionSet); + assert!(scraped.is_ok()); + let scraped = scraped.unwrap(); + assert!(scraped.len() == 1); + assert!(gm.room.sync().len() == 1); + + r2.send(GameEventType::SpecialPeek.build().serialize()).unwrap(); + r2.send(GameEventType::ElectionPend.build().serialize()).unwrap(); + let scraped = gm.scrape_until_gameeventtype(GameEventType::ElectionPend); + assert!(scraped.is_ok()); + let scraped = scraped.unwrap(); + assert!(scraped.len() == 2); + assert!(gm.room.sync().len() == 0); } } diff --git a/secert-hitler/src/controller/gamemaster/gamemaster/setup.rs b/secert-hitler/src/controller/gamemaster/gamemaster/setup.rs index 3574066..a9f1724 100644 --- a/secert-hitler/src/controller/gamemaster/gamemaster/setup.rs +++ b/secert-hitler/src/controller/gamemaster/gamemaster/setup.rs @@ -95,9 +95,6 @@ impl GameMaster { mod tests { use super::*; - use super::super::super::super::super::model::state::mockrooms::MockRooms; - use super::super::super::super::super::model::state::rooms::Rooms; - use super::super::super::player::Player; fn init() { let _ = env_logger::builder()