use af_core::channel;
use af_core::test::prelude::*;
use af_core::thread;
pub fn test(cx: &mut test::Context) {
test!(cx, "::start()", timeout = "1 s", {
let current = std::thread::current().id();
let (tx, rx) = channel::with_capacity(1);
thread::start(module_path!(), move || {
future::try_resolve(tx.send(std::thread::current().id()));
});
let id = rx.recv().await?;
fail::when!(id == current);
});
cx.scope("::Thread::join()", |cx| {
test!(cx, "waits for the thread output", timeout = "1 s", {
let thread = thread::start("fourteen", || 14);
let output = thread.join().await?;
fail::when!(output != 14);
});
test!(cx, "returns an error on panic", timeout = "1 s", {
let thread = thread::start("panicker", || panic!("haha"));
let output = thread.join().await;
fail::when!(output.is_ok());
});
test!(cx, "does not block tasks", {
let thread = thread::start("panicker", || {
std::thread::sleep(std::time::Duration::from_secs(1));
});
let before = Time::now();
let output = future::try_resolve(thread.join());
let elapsed = before.elapsed();
fail::when!(output.is_some());
fail::when!(elapsed > Duration::ms(0.1), "Blocked.");
});
});
test!(cx, "::sleep()", timeout = "1 s", {
let duration = Duration::ms(50);
let thread = thread::start("sleeper", move || {
thread::sleep(duration);
});
let time = Time::now();
thread.join().await?;
fail::when!(time.elapsed().as_ms() < 40.0, "Too fast.");
});
}