messaging_thread_pool 5.0.3

A library for aiding the creation of typed thread pool of objects that is communicated with via channels
Documentation
use messaging_thread_pool::{
    SenderAndReceiver, SenderAndReceiverMock, ThreadPool,
    id_provider::{IdProvider, id_provider_mutex::IdProviderMutex},
    samples::{MeanRequest, Randoms, RandomsAddRequest, SumRequest},
};

#[test]
fn given_id_provider_mutex_when_cloned_then_clone_succeeds_and_preserves_next_id() {
    let provider = IdProviderMutex::new(7);

    let cloned = provider.clone();

    assert_eq!(provider.peek_next_id(), cloned.peek_next_id());
}

#[test]
fn given_shutdown_thread_pool_when_sending_then_returns_error_instead_of_panicking() {
    let pool = ThreadPool::<Randoms>::new(1);

    let _ = pool.shutdown();

    let result = pool.send_and_receive_once(RandomsAddRequest(0));

    assert!(
        result.is_err(),
        "sending after shutdown should return an error"
    );
}

#[test]
fn given_sender_and_receiver_mock_with_no_responses_when_mock_send_and_receive_one_then_no_panic() {
    let mock = SenderAndReceiverMock::<Randoms, MeanRequest>::new(vec![]);

    let result = std::panic::catch_unwind(std::panic::AssertUnwindSafe(|| {
        let _ = mock.send_and_receive_one(MeanRequest(123));
    }));

    assert!(
        result.is_ok(),
        "send_and_receive_one should not panic when a response is missing"
    );
}

#[test]
fn given_missing_pool_item_id_when_message_sent_then_returns_error() {
    let pool = ThreadPool::<Randoms>::new(1);

    let result = pool.send_and_receive_once(SumRequest(999));

    assert!(
        result.is_err(),
        "sending to a missing id should return an error"
    );
}