1
use std::{convert::Infallible, fmt::Debug, hash::Hash};
2

            
3
use super::Manager;
4
use crate::tasks::{Job, Keyed};
5

            
6
#[derive(Debug)]
7
struct Echo<T>(T);
8

            
9
impl<T> Job for Echo<T>
10
where
11
    T: Clone + Eq + Hash + Debug + Send + Sync + 'static,
12
{
13
    type Output = T;
14
    type Error = Infallible;
15

            
16
2
    fn execute(&mut self) -> Result<Self::Output, Self::Error> {
17
2
        Ok(self.0.clone())
18
2
    }
19
}
20

            
21
impl<T> Keyed<T> for Echo<T>
22
where
23
    T: Clone + Eq + Hash + Debug + Send + Sync + 'static,
24
{
25
3
    fn key(&self) -> T {
26
3
        self.0.clone()
27
3
    }
28
}
29

            
30
1
#[test]
31
1
fn simple() -> Result<(), flume::RecvError> {
32
1
    let manager = Manager::<usize>::default();
33
1
    manager.spawn_worker();
34
1
    let handle = manager.enqueue(Echo(1));
35
1
    if let Ok(value) = handle.receive()? {
36
1
        assert_eq!(value, 1);
37

            
38
1
        Ok(())
39
    } else {
40
        unreachable!()
41
    }
42
1
}
43

            
44
1
#[test]
45
1
fn keyed_simple() {
46
1
    let manager = Manager::<usize>::default();
47
1
    let handle = manager.lookup_or_enqueue(Echo(1));
48
1
    let handle2 = manager.lookup_or_enqueue(Echo(1));
49
1
    // Tests that they received the same job id
50
1
    assert_eq!(handle.id, handle2.id);
51
1
    let handle3 = manager.lookup_or_enqueue(Echo(1));
52
1
    assert_eq!(handle3.id, handle.id);
53

            
54
1
    manager.spawn_worker();
55
1

            
56
1
    let result1 = handle.receive().unwrap();
57
1
    let result2 = handle2.receive().unwrap();
58
1
    // Because they're all the same handle, if those have returned, this one
59
1
    // should be available without blocking.
60
1
    let result3 = handle3.receive().unwrap();
61

            
62
3
    for result in [result1, result2, result3] {
63
3
        assert_eq!(result.unwrap(), 1);
64
    }
65
1
}