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::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<Event>,
events_s: Sender<Vec<Event>>,
events_r: Receiver<Vec<Event>>,
}
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<Event> {
let mut unseen: Vec<Event> = 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
}

View File

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