mock rooms can be joined and have dedicated state of feed

master
bel 2020-05-02 14:35:38 -06:00
parent ec8cc697b1
commit 64d577cd83
2 changed files with 51 additions and 8 deletions

View File

@ -3,13 +3,14 @@ use super::event::Event;
use rand::{self, Rng}; use rand::{self, Rng};
use rand::distributions::Alphanumeric; use rand::distributions::Alphanumeric;
use crossbeam_channel::{unbounded, Receiver, Sender}; use crossbeam_channel::{unbounded, Sender, Receiver};
#[derive(Clone, Debug)] #[derive(Clone, Debug)]
pub struct MockRoom { pub struct MockRoom {
last: String, last: String,
room_id: String, room_id: String,
events: Vec<Event>, events_s: Sender<Vec<Event>>,
events_r: Receiver<Vec<Event>>,
} }
impl MockRoom { impl MockRoom {
@ -18,10 +19,13 @@ impl MockRoom {
} }
pub fn join(room_id: String) -> MockRoom { pub fn join(room_id: String) -> MockRoom {
let (s, r) = unbounded();
s.send(vec![]).ok().unwrap();
MockRoom { MockRoom {
last: "".to_string(), last: "".to_string(),
room_id: room_id, 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<Event> { fn sync(&mut self) -> Vec<Event> {
let mut unseen: Vec<Event> = vec![]; let mut unseen: Vec<Event> = vec![];
let mut last = self.last.clone(); 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 { if e.next == self.last {
unseen.clear(); unseen.clear();
} else { } else {
@ -42,6 +47,7 @@ impl Room for MockRoom {
last = e.next.clone(); last = e.next.clone();
} }
} }
self.events_s.send(events).ok().unwrap();
self.last = last; self.last = last;
return unseen; return unseen;
} }
@ -52,7 +58,9 @@ impl Room for MockRoom {
next: rands(), next: rands(),
body: message, 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") Ok("ok")
} }
@ -63,7 +71,7 @@ impl Room for MockRoom {
impl Drop for MockRoom { impl Drop for MockRoom {
fn drop(&mut self) { fn drop(&mut self) {
println!("not impl"); println!("MockRoom::drop not impl");
} }
} }
@ -84,14 +92,15 @@ mod tests {
fn _dummy() -> MockRoom { fn _dummy() -> MockRoom {
let mut r = MockRoom::create(); let mut r = MockRoom::create();
r.last = "1".to_string(); r.last = "1".to_string();
r.events = vec![]; let mut events = r.events_r.recv().ok().unwrap();
for i in 0..5 { for i in 0..5 {
r.events.push(Event{ events.push(Event{
sender: i.to_string(), sender: i.to_string(),
next: i.to_string(), next: i.to_string(),
body: i.to_string(), body: i.to_string(),
}); });
} }
r.events_s.send(events).ok().unwrap();
r r
} }

View File

@ -86,4 +86,38 @@ mod tests {
assert!(r.is_ok()); assert!(r.is_ok());
assert!(r.ok().unwrap().room_id() == "0"); 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");
}
} }