wl-proxy 0.1.2

Wayland connection proxy
Documentation
use {
    crate::handler::{HandlerHolder, HandlerMut, HandlerRef},
    std::{cell::Cell, rc::Rc},
};

#[test]
fn replace() {
    let holder = HandlerHolder::default();
    struct Handler(Rc<Cell<i32>>, i32);
    impl Drop for Handler {
        fn drop(&mut self) {
            self.0.set(self.1);
        }
    }
    let last_dropped = Rc::new(Cell::new(0));
    holder.set(Some(Box::new(Handler(last_dropped.clone(), 1))));
    assert_eq!(last_dropped.get(), 0);
    holder.set(None);
    assert_eq!(last_dropped.get(), 1);
    holder.set(Some(Box::new(Handler(last_dropped.clone(), 2))));
    assert_eq!(last_dropped.get(), 1);

    let borrow = holder.borrow_mut();
    holder.set(Some(Box::new(Handler(last_dropped.clone(), 3))));
    assert_eq!(last_dropped.get(), 1);
    drop(borrow);
    assert_eq!(last_dropped.get(), 2);

    let borrow = holder.borrow_mut();
    holder.set(Some(Box::new(Handler(last_dropped.clone(), 4))));
    assert_eq!(last_dropped.get(), 2);
    holder.set(Some(Box::new(Handler(last_dropped.clone(), 5))));
    assert_eq!(last_dropped.get(), 4);
    drop(borrow);
    assert_eq!(last_dropped.get(), 3);
}

#[test]
fn borrow() {
    let holder = HandlerHolder::default();
    holder.set(Some(Box::new(1)));
    assert_eq!(*holder.borrow_mut(), Some(Box::new(1)));
    assert_eq!(holder.try_borrow().as_deref(), Some(&Some(Box::new(1))));
    assert_eq!(holder.try_borrow_mut().as_deref(), Some(&Some(Box::new(1))));
    let mut borrow = holder.borrow_mut();
    assert_eq!(holder.try_borrow().as_deref(), None);
    assert_eq!(holder.try_borrow_mut().as_deref(), None);
    *borrow = Some(Box::new(2));
    drop(borrow);
    let _borrow = holder.try_borrow().unwrap();
    let borrow = holder.try_borrow().unwrap();
    assert_eq!(holder.try_borrow_mut().as_deref(), None);
    assert_eq!(*borrow, Some(Box::new(2)));
}

#[test]
#[should_panic]
fn multi_borrow() {
    let holder = HandlerHolder::default();
    holder.set(Some(Box::new(1)));
    let _borrow = holder.borrow_mut();
    holder.borrow_mut();
}

#[test]
fn map() {
    let holder = HandlerHolder::default();
    holder.set(Some(Box::new(1)));
    {
        let borrow = holder.borrow_mut();
        let borrow = HandlerMut::map(borrow, |b| b.as_deref_mut().unwrap());
        assert_eq!(*borrow, 1);
        assert_eq!(format!("{:?}", borrow), "1");
        assert_eq!(format!("{}", borrow), "1");
    }
    {
        let borrow = holder.try_borrow().unwrap();
        let borrow = HandlerRef::map(borrow, |b| b.as_deref().unwrap());
        assert_eq!(*borrow, 1);
        assert_eq!(format!("{:?}", borrow), "1");
        assert_eq!(format!("{}", borrow), "1");
    }
}

#[test]
fn clone() {
    let holder = HandlerHolder::default();
    holder.set(Some(Box::new(1)));
    let borrow = holder.try_borrow().unwrap();
    let borrow = HandlerRef::clone(&borrow);
    assert_eq!(*borrow, Some(Box::new(1)));
}