win-events 0.0.2

A poor attempt to implement WaitForMultipleObjects and the ManualReset, AutoReset and Pulse types
Documentation
use std::thread::{sleep, spawn};
use std::time::Duration;

use win_events::{wait_all, wait_first, PulseEvent};

#[test]
fn pe_test_init() {
    let event = PulseEvent::new();
    assert!(!event.is_set());
}

#[test]
fn pe_test_set_event() {
    let event = PulseEvent::new();
    event.set();
    assert!(!event.is_set());
}

#[test]
fn pe_test_clear_event() {
    let event = PulseEvent::new();
    event.set();
    event.clear();
    assert!(!event.is_set());
}

#[test]
fn pe_test_thread_wait() {
    let event = PulseEvent::new();
    let event2 = event.clone();
    let worker = spawn(move || {
        sleep(Duration::from_millis(5));
        event2.set();
    });

    let wait_result = event.wait(Duration::from_millis(100)).unwrap();
    assert!(wait_result);
    worker.join().unwrap();
}

#[test]
fn pe_test_wait_already_set() {
    let event = PulseEvent::new();
    assert!(!event.wait(Duration::from_millis(1)).unwrap())
}

#[test]
fn pe_test_wait_timeout() {
    let event = PulseEvent::new();
    assert!(!event.wait(Duration::from_millis(0)).unwrap())
}

#[test]
fn pe_test_wait_first() {
    let set_event0 = PulseEvent::new();
    let set_event1 = PulseEvent::new();
    let set_event2 = PulseEvent::new();

    let inner_set = set_event2.clone();

    let worker = spawn(move || {
        sleep(Duration::from_millis(10));
        inner_set.set()
    });

    let wait_result = wait_first(
        vec![&set_event0, &set_event1, &set_event2],
        Duration::from_millis(100),
    )
    .unwrap();
    assert_eq!(2, wait_result);
    worker.join().unwrap();
}

#[test]
fn pe_test_wait_first_timeout() {
    let set_event0 = PulseEvent::new();
    let set_event1 = PulseEvent::new();
    let set_event2 = PulseEvent::new();

    let wait_result = wait_first(
        vec![&set_event0, &set_event1, &set_event2],
        Duration::from_millis(3),
    )
    .unwrap();

    assert_eq!(-1, wait_result);
}

#[test]
fn pe_test_wait_all() {
    let set_event0 = PulseEvent::new();
    let set_event1 = PulseEvent::new();
    let set_event2 = PulseEvent::new();

    let inner_set0 = set_event0.clone();
    let inner_set1 = set_event1.clone();
    let inner_set2 = set_event2.clone();

    let worker = spawn(move || {
        sleep(Duration::from_millis(10));
        inner_set0.set();
        inner_set1.set();
        inner_set2.set();
    });

    let wait_result = wait_all(
        vec![&set_event0, &set_event1, &set_event2],
        Duration::from_millis(100),
    )
    .unwrap();

    assert_eq!(true, wait_result);
    worker.join().unwrap();
}

#[test]
fn pe_test_wait_all_partial_set() {
    let set_event0 = PulseEvent::new();
    let set_event1 = PulseEvent::new();
    let set_event2 = PulseEvent::new();

    let inner_set = set_event2.clone();

    let worker = spawn(move || {
        sleep(Duration::from_millis(1));
        inner_set.set();
    });

    let wait_result = wait_first(
        vec![&set_event0, &set_event1, &set_event2],
        Duration::from_millis(10),
    )
    .unwrap();

    assert_eq!(2, wait_result);
    worker.join().unwrap();
}

#[test]
fn pe_test_wait_all_timeout() {
    let set_event0 = PulseEvent::new();
    let set_event1 = PulseEvent::new();
    let set_event2 = PulseEvent::new();

    let wait_result = wait_all(
        vec![&set_event0, &set_event1, &set_event2],
        Duration::from_millis(0),
    )
    .unwrap();

    assert_eq!(false, wait_result);
}