diff --git a/secert-hitler/src/controller/state/mockroom.rs b/secert-hitler/src/controller/state/mockroom.rs index cd57dc5..82f08fa 100644 --- a/secert-hitler/src/controller/state/mockroom.rs +++ b/secert-hitler/src/controller/state/mockroom.rs @@ -3,13 +3,14 @@ use super::event::Event; use rand::{self, Rng}; use rand::distributions::Alphanumeric; -use crossbeam_channel::{unbounded, Receiver, Sender}; +use crossbeam_channel::{unbounded, Sender, Receiver}; #[derive(Clone, Debug)] pub struct MockRoom { last: String, room_id: String, - events: Vec, + events_s: Sender>, + events_r: Receiver>, } impl MockRoom { @@ -18,10 +19,13 @@ impl MockRoom { } pub fn join(room_id: String) -> MockRoom { + let (s, r) = unbounded(); + s.send(vec![]).ok().unwrap(); MockRoom { last: "".to_string(), room_id: room_id, - events: vec![], + events_s: s, + events_r: r, } } @@ -34,7 +38,8 @@ impl Room for MockRoom { fn sync(&mut self) -> Vec { let mut unseen: Vec = vec![]; let mut last = self.last.clone(); - for e in &self.events { + let events = self.events_r.recv().ok().unwrap(); + for e in &events { if e.next == self.last { unseen.clear(); } else { @@ -42,6 +47,7 @@ impl Room for MockRoom { last = e.next.clone(); } } + self.events_s.send(events).ok().unwrap(); self.last = last; return unseen; } @@ -52,7 +58,9 @@ impl Room for MockRoom { next: rands(), body: message, }; - self.events.push(e); + let mut events = self.events_r.recv().ok().unwrap(); + events.push(e); + self.events_s.send(events).ok().unwrap(); Ok("ok") } @@ -63,7 +71,7 @@ impl Room for MockRoom { impl Drop for MockRoom { fn drop(&mut self) { - println!("not impl"); + println!("MockRoom::drop not impl"); } } @@ -84,14 +92,15 @@ mod tests { fn _dummy() -> MockRoom { let mut r = MockRoom::create(); r.last = "1".to_string(); - r.events = vec![]; + let mut events = r.events_r.recv().ok().unwrap(); for i in 0..5 { - r.events.push(Event{ + events.push(Event{ sender: i.to_string(), next: i.to_string(), body: i.to_string(), }); } + r.events_s.send(events).ok().unwrap(); r } diff --git a/secert-hitler/src/controller/state/mockrooms.rs b/secert-hitler/src/controller/state/mockrooms.rs index 963aa5f..9b1f042 100644 --- a/secert-hitler/src/controller/state/mockrooms.rs +++ b/secert-hitler/src/controller/state/mockrooms.rs @@ -86,4 +86,38 @@ mod tests { assert!(r.is_ok()); assert!(r.ok().unwrap().room_id() == "0"); } + + #[test] + fn join_clobber() { + 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); + assert!(a.send("from a".to_string()).is_ok()); + assert!(a.sync().len() == 1); + assert!(b.sync().len() == 1); + assert!(b.send("from b".to_string()).is_ok()); + assert!(b.send("from b".to_string()).is_ok()); + assert!(a.sync().len() == 2); + assert!(b.sync().len() == 2); + assert!(a.send("from a".to_string()).is_ok()); + assert!(b.send("from b".to_string()).is_ok()); + assert!(a.send("from a".to_string()).is_ok()); + assert!(a.sync().len() == 3); + assert!(b.sync().len() == 3); + assert!(a.send("from a".to_string()).is_ok()); + assert!(b.send("from b".to_string()).is_ok()); + let a = a.sync(); + let b = b.sync(); + assert!(a.len() == 2); + assert!(b.len() == 2); + assert!(a[0].body == "from a"); + assert!(b[0].body == "from a"); + assert!(a[1].body == "from b"); + assert!(b[1].body == "from b"); + } }