ach-cell 0.2.4

Atomic Channel
Documentation
use ach_cell::Cell;

#[test]
fn base() {
    static CELL: Cell<usize> = Cell::new();

    assert!(CELL.set(1).is_ok());
    assert!(CELL.is_initialized());
    assert!(CELL.set(2).is_err());
    assert_eq!(CELL.take().unwrap(), Some(1));
    assert!(!CELL.is_initialized());
    assert!(CELL.take().unwrap().is_none());

    assert!(CELL.ref_num().is_err());
    assert!(CELL.set(3).is_ok());
    assert_eq!(CELL.ref_num(), Ok(0));
    let refer = CELL.get().unwrap();
    assert_eq!(CELL.ref_num(), Ok(1));
    assert_eq!(*refer, 3);
    assert!(CELL.try_take().is_err());
    drop(refer);
    assert_eq!(CELL.take().unwrap(), Some(3));

    assert!(CELL.set(4).is_ok());
    assert_eq!(*CELL.get().unwrap(), 4);
    assert_eq!(CELL.take().unwrap(), Some(4));

    assert_eq!(CELL.replace(5).unwrap(), None);
    assert_eq!(CELL.replace(6).unwrap(), Some(5));
    let refer = CELL.get();
    assert_eq!(CELL.try_replace(7).unwrap_err().input, 7);
    drop(refer);
    assert_eq!(CELL.replace(8).unwrap(), Some(6));
    assert_eq!(CELL.take().unwrap(), Some(8));
}