run chancellor selection
parent
ccd6d5694e
commit
d5486b8a15
|
|
@ -125,10 +125,14 @@ impl GameEvent {
|
||||||
|
|
||||||
pub fn serialize(&self) -> String {
|
pub fn serialize(&self) -> String {
|
||||||
(json::object!{
|
(json::object!{
|
||||||
GameEventType: format!("{:?}", self.mode()),
|
body: json::stringify(json::object!{
|
||||||
sources: self.sources(),
|
GameEventType: format!("{:?}", self.mode()),
|
||||||
targets: self.targets(),
|
sources: self.sources(),
|
||||||
params: self.params(),
|
targets: self.targets(),
|
||||||
|
params: self.params(),
|
||||||
|
}),
|
||||||
|
sender: "__gm__",
|
||||||
|
msgtype: "m.text".to_string(),
|
||||||
}).dump()
|
}).dump()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -246,31 +250,31 @@ mod tests {
|
||||||
d: json::object!{},
|
d: json::object!{},
|
||||||
sender: "a".to_string(),
|
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{
|
let ge = GameEvent{
|
||||||
d: json::object!{GameEventType: "GameStart"},
|
d: json::object!{GameEventType: "GameStart"},
|
||||||
sender: "a".to_string(),
|
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{
|
let ge = GameEvent{
|
||||||
d: json::object!{GameEventType: "GameStart", params: ["hi"]},
|
d: json::object!{GameEventType: "GameStart", params: ["hi"]},
|
||||||
sender: "a".to_string(),
|
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{
|
let ge = GameEvent{
|
||||||
d: json::object!{GameEventType: "GameStart", sources: ["hi"], targets: ["hi2"]},
|
d: json::object!{GameEventType: "GameStart", sources: ["hi"], targets: ["hi2"]},
|
||||||
sender: "a".to_string(),
|
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{
|
let ge = GameEvent{
|
||||||
d: json::object!{GameEventType: "Null", sources: ["hi"], targets: ["hi2"]},
|
d: json::object!{GameEventType: "Null", sources: ["hi"], targets: ["hi2"]},
|
||||||
sender: "a".to_string(),
|
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());
|
debug!("sample gameevent serialize: {}", ge.serialize());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -3,8 +3,8 @@ use super::super::gameevent::GameEvent;
|
||||||
use super::super::gameevent::GameEventType;
|
use super::super::gameevent::GameEventType;
|
||||||
use super::super::policy::Policy;
|
use super::super::policy::Policy;
|
||||||
use super::super::role::Role;
|
use super::super::role::Role;
|
||||||
use super::super::player::Player;
|
|
||||||
|
|
||||||
|
use log::debug;
|
||||||
use json;
|
use json;
|
||||||
|
|
||||||
impl GameMaster {
|
impl GameMaster {
|
||||||
|
|
@ -35,7 +35,22 @@ impl GameMaster {
|
||||||
if self.room.send(ge.serialize()).is_err() {
|
if self.room.send(ge.serialize()).is_err() {
|
||||||
return Err(Role::Null);
|
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> {
|
pub fn game_election_vote(&mut self) -> Result<GameEvent, Role> {
|
||||||
|
|
@ -71,6 +86,7 @@ mod tests {
|
||||||
use super::super::super::super::super::config;
|
use super::super::super::super::super::config;
|
||||||
|
|
||||||
use log::{debug, LevelFilter};
|
use log::{debug, LevelFilter};
|
||||||
|
use json;
|
||||||
|
|
||||||
fn init() {
|
fn init() {
|
||||||
let _ = env_logger::builder()
|
let _ = env_logger::builder()
|
||||||
|
|
@ -158,4 +174,63 @@ mod tests {
|
||||||
assert!(gm.game_is_over().is_err());
|
assert!(gm.game_is_over().is_err());
|
||||||
assert!(gm.game_is_over().err().unwrap() == Role::Facist);
|
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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -96,8 +96,9 @@ impl GameMaster {
|
||||||
for e in &events {
|
for e in &events {
|
||||||
scraped.push(e.clone());
|
scraped.push(e.clone());
|
||||||
let ge = GameEvent::new(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 {
|
if ge.mode() == get {
|
||||||
|
debug!("/scrape_until {:?}: {:?}: ge: {:?}", get, ge.mode() == get, ge);
|
||||||
self.room.rollback(e.since.clone());
|
self.room.rollback(e.since.clone());
|
||||||
return Ok(scraped);
|
return Ok(scraped);
|
||||||
}
|
}
|
||||||
|
|
@ -156,5 +157,21 @@ mod tests {
|
||||||
let e = scraped.first().unwrap();
|
let e = scraped.first().unwrap();
|
||||||
assert!(GameEvent::new(e.clone()).mode() == GameEventType::Null, "{:?}", e);
|
assert!(GameEvent::new(e.clone()).mode() == GameEventType::Null, "{:?}", e);
|
||||||
assert!(gm.room.sync().len() == 0);
|
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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -95,9 +95,6 @@ impl GameMaster {
|
||||||
|
|
||||||
mod tests {
|
mod tests {
|
||||||
use super::*;
|
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() {
|
fn init() {
|
||||||
let _ = env_logger::builder()
|
let _ = env_logger::builder()
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue