use std::thread::sleep;
use std::time::Duration;
use std::u32;

use easy_parallel::Parallel;
use parking::Parker;

#[test]
fn park_timeout_unpark_before() {
    let p = Parker::new();
    for _ in 0..10 {
        p.unparker().unpark();
        p.park_timeout(Duration::from_millis(u32::MAX as u64));
    }
}

#[test]
fn park_timeout_unpark_not_called() {
    let p = Parker::new();
    for _ in 0..10 {
        p.park_timeout(Duration::from_millis(10));
    }
}

#[test]
fn park_timeout_unpark_called_other_thread() {
    for _ in 0..10 {
        let p = Parker::new();
        let u = p.unparker();

        Parallel::new()
            .add(move || {
                sleep(Duration::from_millis(50));
                u.unpark();
            })
            .add(move || {
                p.park_timeout(Duration::from_millis(u32::MAX as u64));
            })
            .run();
    }
}
