use super::*;
use crossbeam_channel::{TryRecvError, bounded};
#[test]
fn test_real_timers_match_crossbeam_immediate_delivery() {
let clock = Clock::real();
let deadline = clock.now();
for (name, timer) in [
("clock", clock.at(deadline)),
("crossbeam", crossbeam_channel::at(deadline)),
] {
assert_eq!(timer.capacity(), Some(1), "{name}");
assert_eq!(timer.try_recv(), Ok(deadline), "{name}");
assert_eq!(timer.try_recv(), Err(TryRecvError::Empty), "{name}");
}
let before = clock.now();
let timers = [
clock.after(Duration::ZERO),
crossbeam_channel::after(Duration::ZERO),
];
let after = clock.now();
for (index, timer) in timers.into_iter().enumerate() {
assert!(
(before..=after).contains(&timer.try_recv().unwrap()),
"{index}"
);
assert_eq!(timer.try_recv(), Err(TryRecvError::Empty), "{index}");
}
for (name, timer) in [
("clock", clock.after(Duration::MAX)),
("crossbeam", crossbeam_channel::after(Duration::MAX)),
] {
assert_eq!(timer.capacity(), Some(0), "{name}");
assert_eq!(timer.try_recv(), Err(TryRecvError::Empty), "{name}");
}
}
#[test]
fn test_real_receive_adapters_match_crossbeam_precedence() {
for relative in [false, true] {
let clock = Clock::real();
let deadline = clock.now();
let (sender, receiver) = bounded(1);
let (reference_sender, reference) = bounded(1);
let receive = || {
if relative {
clock.recv_timeout(&receiver, Duration::ZERO)
} else {
clock.recv_deadline(&receiver, deadline)
}
};
let direct = || {
if relative {
reference.recv_timeout(Duration::ZERO)
} else {
reference.recv_deadline(deadline)
}
};
sender.send(7).unwrap();
reference_sender.send(7).unwrap();
assert_eq!(receive(), direct(), "{relative}");
assert_eq!(receive(), direct(), "{relative}");
assert_eq!(receive(), Err(RecvTimeoutError::Timeout), "{relative}");
drop(sender);
drop(reference_sender);
assert_eq!(receive(), direct(), "{relative}");
assert_eq!(receive(), Err(RecvTimeoutError::Disconnected), "{relative}");
}
let clock = Clock::real();
let (sender, receiver) = bounded(1);
sender.send(7).unwrap();
drop(sender);
assert_eq!(clock.recv_timeout(&receiver, Duration::MAX), Ok(7));
assert_eq!(
clock.recv_timeout(&receiver, Duration::MAX),
Err(RecvTimeoutError::Disconnected)
);
}