run chancellor selection

master
bel 2020-05-06 21:19:17 -06:00
parent ccd6d5694e
commit d5486b8a15
4 changed files with 108 additions and 15 deletions

View File

@ -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());
}
}

View File

@ -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<GameEvent, Role> {
@ -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);
}
}

View File

@ -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);
}
}

View File

@ -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()