use sigq::{Puller, Pusher, StaleErr};
fn std_test(tx: &Pusher<&str>, rx: &Puller<&str>) {
assert_eq!(rx.try_pop(), Ok(None));
tx.push("hello").unwrap();
assert_eq!(rx.try_pop(), Ok(Some("hello")));
assert_eq!(rx.try_pop(), Ok(None));
}
#[test]
fn try_pop_retvals() {
let (tx, rx) = sigq::new();
std_test(&tx, &rx);
drop(tx);
assert_eq!(rx.try_pop(), Err(StaleErr));
}
#[test]
fn try_pop_with_only_weak_tx() {
let (tx, rx) = sigq::new::<&str>();
let _wtx = tx.weak();
drop(tx);
assert_eq!(rx.try_pop(), Err(StaleErr));
}
#[test]
fn drop_nonempty() {
let (tx, rx) = sigq::new();
assert_eq!(rx.try_pop(), Ok(None));
tx.push("hello").unwrap();
drop(tx);
assert_eq!(rx.try_pop(), Ok(Some("hello")));
assert_eq!(rx.try_pop(), Err(StaleErr));
}
#[test]
fn unblock_on_stale() {
let (tx, rx) = sigq::new::<&str>();
let jh = std::thread::spawn(move || match rx.pop() {
Ok(_) => false,
Err(StaleErr) => true
});
std::thread::sleep(std::time::Duration::from_millis(500));
drop(tx);
assert!(jh.join().unwrap());
}
#[test]
fn stale_puller() {
let (tx, rx) = sigq::new::<&str>();
drop(rx);
assert_eq!(tx.push("hello"), Err(StaleErr));
}
#[test]
fn weak_to_strong() {
let (tx, rx) = sigq::new::<&str>();
let wtx = tx.weak();
let Some(tx2) = wtx.upgrade() else {
panic!("Unable to upgrade weak Pusher");
};
std_test(&tx2, &rx);
drop(tx);
assert_eq!(rx.try_pop(), Ok(None));
drop(tx2);
assert_eq!(rx.try_pop(), Err(StaleErr));
}
#[test]
fn no_strong_weak_upgrade_fail() {
let (tx, _rx) = sigq::new::<&str>();
let wtx = tx.weak();
drop(tx);
let Some(_) = wtx.upgrade() else {
panic!("Upgrade unexpectedly successful");
};
}