background-runner 0.1.2

Run a heavy task in the background multiple times without blocking the triggering thread
Documentation
use std::{sync::mpsc, thread::sleep, time::Duration};

use crate::BackgroundRunner;

#[test]
fn test_initial_update() {
    let (tx, rx) = mpsc::channel();
    let runner = BackgroundRunner::new(move |data| {
        tx.send(*data).unwrap();
    });

    let sent_data = 42;
    runner.update(&sent_data);

    let received_data = rx.recv().unwrap();
    assert_eq!(received_data, sent_data);
}

#[test]
fn test_wait_update() {
    let (tx, rx) = mpsc::channel();
    let runner = BackgroundRunner::new(move |data| {
        sleep(Duration::from_millis(100));
        tx.send(*data).unwrap();
        sleep(Duration::from_millis(100));
    });

    let sent_data = 0;
    runner.update(&sent_data);

    // Wait for the runner to start processing
    sleep(Duration::from_millis(40));

    // Send the final update
    let sent_data = 42;
    runner.wait_and_update(&sent_data);

    runner.join();

    let mut last_received_data = rx.recv().unwrap();
    while let Ok(data) = rx.try_recv() {
        last_received_data = data;
    }
    assert_eq!(last_received_data, sent_data);
}

#[test]
fn test_final_update() {
    let (tx, rx) = mpsc::channel();
    let runner = BackgroundRunner::new(move |data| {
        sleep(Duration::from_millis(100));
        tx.send(*data).unwrap();
        sleep(Duration::from_millis(100));
    });

    let sent_data = 0;
    runner.update(&sent_data);

    let sent_data = 42;
    runner.wait_and_update(&sent_data);

    runner.join();

    let mut last_received_data = rx.recv().unwrap();
    while let Ok(data) = rx.try_recv() {
        last_received_data = data;
    }
    assert_eq!(last_received_data, sent_data);
}