use super::*;
#[derive(Clone)]
enum Change {
Push(u32),
Pop,
}
impl TakesMessage<Change> for Vec<u32> {
fn take_message(&mut self, t: &Change) {
match t {
&Change::Push(x) => { self.push(x); },
&Change::Pop => { self.pop(); },
}
}
}
#[test]
fn wrapping_unwrapping() {
let w = TcWriter::new(10);
let r = w.add_reader(vec![1,2,3]);
let cmp : Vec<u32> = vec![1,2,3];
assert_eq!(&cmp, &*r);
}
#[test]
fn staleness() {
let w = TcWriter::new(10);
let mut r = w.add_reader(vec![1,2,3]);
w.apply_change(Change::Pop);
r.update();
w.apply_change(Change::Pop);
w.apply_change(Change::Pop);
let cmp : Vec<u32> = vec![1,2];
assert_eq!(cmp, r.into_inner());
}
#[test]
fn w1_r1_multithreaded() {
use std::time::Duration;
use std::thread;
let w = TcWriter::new(10);
let mut r = w.add_reader(vec![]);
let ten_millis = Duration::from_millis(10);
let mut handles = vec![];
for i in 0..5 {
let w_clone = w.clone();
handles.push(thread::spawn(move || {
thread::sleep(ten_millis);
w_clone.clone().apply_change(Change::Push(i));
thread::sleep(ten_millis);
}));
}
assert_eq!(r.len(), 0);
thread::sleep(ten_millis);
r.update();
assert!(r.len() <= 5);
for h in handles {
h.join().is_ok();
}
r.update();
assert_eq!(r.len(), 5);
}
#[test]
fn limited_sync() {
use std::thread;
let w1 = TcWriter::new(16);
let mut r = w1.add_reader(vec![]);
let w2 = w1.clone();
let h1 = thread::spawn(move || {
for i in 0..16 {
let _ = w1.try_apply_change(Change::Push(i));
}
});
let h2 = thread::spawn(move || {
for i in 0..16 {
let _ = w2.try_apply_change(Change::Push(i));
}
});
h1.join().is_ok();
h2.join().is_ok();
r.update_limited(5);
assert_eq!(r.len(), 5);
r.update();
assert_eq!(r.len(), 16);
}
#[test]
fn deref_mut() {
let w1 = TcWriter::new(16);
let mut r = w1.add_reader(vec![]);
(*r) = vec![1,2,3];
w1.apply_change(Change::Pop);
r.update();
let cmp: Vec<u32> = vec![1,2];
assert_eq!(cmp, r.into_inner());
}
#[test]
fn deref() {
let w1 = TcWriter::new(16);
let mut r = w1.add_reader(vec![]);
w1.apply_change(Change::Push(1));
{
let b1 = &*r;
w1.apply_change(Change::Push(2));
let b2 = &*r;
let b3 = &*r;
w1.apply_change(Change::Push(3));
println!("{:?} {:?} {:?}", b1, b2, b3);
}
r.update();
let mut cmp: Vec<u32> = vec![1,2,3];
assert_eq!(&mut cmp, &mut *r);
assert_eq!(&mut cmp, &*r);
assert_eq!(&cmp, &mut *r);
assert_eq!(&cmp, &*r);
assert_eq!(cmp, *r);
}