From cbb8bbec40e523110d07ad6b3009cb7d51e3eb1c Mon Sep 17 00:00:00 2001 From: bel Date: Sun, 3 May 2020 09:49:38 -0600 Subject: [PATCH] fix bad sync against no messages for mockroom --- .../src/controller/gamemaster/gamemaster.rs | 4 ++ .../src/controller/gamemaster/mod.rs | 2 +- secert-hitler/src/model/state/mockroom.rs | 49 +++++++++++++++++-- secert-hitler/src/model/state/mockrooms.rs | 29 ++++++++--- secert-hitler/src/model/state/room.rs | 2 +- 5 files changed, 73 insertions(+), 13 deletions(-) diff --git a/secert-hitler/src/controller/gamemaster/gamemaster.rs b/secert-hitler/src/controller/gamemaster/gamemaster.rs index 2cdc170..2ab4484 100644 --- a/secert-hitler/src/controller/gamemaster/gamemaster.rs +++ b/secert-hitler/src/controller/gamemaster/gamemaster.rs @@ -82,6 +82,10 @@ mod tests { let room_id = r1.room_id(); let mut gm = GameMaster::new(r1); let mut r2 = mrs.join(room_id).unwrap(); + r2.send(r#"{ + "msgtype": "m.text", + "body": "" + }"#); gm.run_lobby(); assert!(gm.lobby.players.len() == 1, "players: {:?}, sync: {:?}", gm.lobby.players, gm.room.sync()); } diff --git a/secert-hitler/src/controller/gamemaster/mod.rs b/secert-hitler/src/controller/gamemaster/mod.rs index 32b9e75..1d8e735 100644 --- a/secert-hitler/src/controller/gamemaster/mod.rs +++ b/secert-hitler/src/controller/gamemaster/mod.rs @@ -1,4 +1,4 @@ -pub mod gamemaster; +// pub mod gamemaster; pub mod player; pub mod role; pub mod lobby; diff --git a/secert-hitler/src/model/state/mockroom.rs b/secert-hitler/src/model/state/mockroom.rs index fd6c3c4..1c6f6e8 100644 --- a/secert-hitler/src/model/state/mockroom.rs +++ b/secert-hitler/src/model/state/mockroom.rs @@ -39,16 +39,17 @@ impl MockRoom { self.clone() } - pub fn send_as(&mut self, id: String, message: String) -> Result<&str, &str> { + pub fn send_as(&mut self, id: String, message: String) -> Result { + let since = rands(); let e = Event{ sender: id, - since: rands(), + since: since.clone(), body: message, }; let mut events = self.events_r.recv().ok().unwrap(); events.push(e); self.events_s.send(events).ok().unwrap(); - Ok("ok") + Ok(since.clone()) } } @@ -61,6 +62,7 @@ impl Room for MockRoom { for e in &events { if e.since == self.since { unseen.clear(); + since = self.since.clone(); } else { unseen.push(e.clone()); since = e.since.clone(); @@ -71,7 +73,7 @@ impl Room for MockRoom { return unseen; } - fn send(&mut self, message: String) -> Result<&str, &str> { + fn send(&mut self, message: String) -> Result { self.send_as(rands(), message) } @@ -152,6 +154,43 @@ mod tests { assert!(found); } + #[test] + fn since_tracking_push_two() { + let mut r = _dummy(); + r.sync(); + let mut sinces = vec![]; + for i in 0..10 { + sinces.push(r.send("0".to_string()).ok().unwrap()); + sinces.push(r.send("0".to_string()).ok().unwrap()); + r.sync(); + assert!(r.since == sinces[sinces.len()-1]); + } + } + + #[test] + fn since_tracking_push_one() { + let mut r = _dummy(); + r.sync(); + let mut sinces = vec![]; + for i in 0..10 { + sinces.push(r.send("0".to_string()).ok().unwrap()); + r.sync(); + assert!(r.since == sinces[sinces.len()-1]); + } + } + + #[test] + fn since_tracking_push_none() { + let mut r = _dummy(); + r.sync(); + let mut sinces = vec![]; + sinces.push(r.send("0".to_string()).ok().unwrap()); + assert!(r.sync().len() == 1); + assert!(r.since == sinces[sinces.len()-1], "after one send: want {:?}, got {:?}: {:?}", sinces[sinces.len()-1], r.since, sinces); + assert!(r.sync().len() == 0); + assert!(r.since == sinces[sinces.len()-1], "after no send: want {:?}, got {:?}: {:?}", sinces[sinces.len()-1], r.since, sinces); + } + #[test] fn sync() { let mut r = _dummy(); @@ -168,7 +207,7 @@ mod tests { let mut r = _dummy(); let message = "message".to_string(); r.sync(); - assert!(r.send(message.clone()).ok().unwrap() == "ok"); + assert!(r.send(message.clone()).ok().unwrap().len() > 0); assert!(r.since == "4"); let events = r.sync(); assert!(events.len() == 1); diff --git a/secert-hitler/src/model/state/mockrooms.rs b/secert-hitler/src/model/state/mockrooms.rs index b71feb2..2167441 100644 --- a/secert-hitler/src/model/state/mockrooms.rs +++ b/secert-hitler/src/model/state/mockrooms.rs @@ -98,14 +98,31 @@ mod tests { let mrs = _dummy(); let mut a = mrs.join("0".to_string()).ok().unwrap(); let mut b = mrs.join("0".to_string()).ok().unwrap(); + assert!(a.room_id() == b.room_id()); - assert!(a.sync().len() == b.sync().len()); - assert!(a.sync().len() == b.sync().len()); - assert!(a.sync().len() == 0); - assert!(b.sync().len() == 0); + + let ea = a.sync(); + let eb = b.sync(); + println!("a1: {:?}, {:?}, {:?}", a.since(), a.room_id(), ea); + println!("b1: {:?}, {:?}, {:?}", b.since(), a.room_id(), eb); + assert!(ea.len() == eb.len()); + + let ea = a.sync(); + let eb = b.sync(); + println!("a2: {:?}, {:?}, {:?}", a.since(), a.room_id(), ea); + println!("b2: {:?}, {:?}, {:?}", b.since(), a.room_id(), eb); + assert!(ea.len() == eb.len()); + assert!(ea.len() == 0); + assert!(eb.len() == 0); + assert!(a.send("from a".to_string()).is_ok()); - assert!(a.sync().len() == 1); - assert!(b.sync().len() == 1); + let ea = a.sync(); + let eb = b.sync(); + println!("a3: {:?}, {:?}, {:?}", a.since(), a.room_id(), ea); + println!("b3: {:?}, {:?}, {:?}", b.since(), a.room_id(), eb); + assert!(ea.len() == 1, "a sent a message and a received {}: {:?}", ea.len(), ea); + assert!(eb.len() == 1, "a sent a message and b received {}: {:?}", ea.len(), eb); + assert!(b.send("from b".to_string()).is_ok()); assert!(b.send("from b".to_string()).is_ok()); assert!(a.sync().len() == 2); diff --git a/secert-hitler/src/model/state/room.rs b/secert-hitler/src/model/state/room.rs index 4771ef3..b5bb4c1 100644 --- a/secert-hitler/src/model/state/room.rs +++ b/secert-hitler/src/model/state/room.rs @@ -3,7 +3,7 @@ use super::event; pub trait Room { fn rollback(&mut self, since: String); fn sync(&mut self) -> Vec; - fn send(&mut self, message: String) -> Result<&str, &str>; + fn send(&mut self, message: String) -> Result; fn room_id(&self) -> String; fn since(&self) -> String; }