hydro2_basic_operators/
single_to_tri_op.rs

1// ---------------- [ File: src/single_to_tri_op.rs ]
2crate::ix!();
3
4// --------------------------------------
5// SingleToTriOp
6// --------------------------------------
7#[derive(NamedItem, Operator, Debug)]
8#[operator(
9    execute="run_op",
10    opcode="BasicOpCode::SingleToTriOp",
11    input0="i32",
12    output0="i32",
13    output1="i32",
14    output2="i32"
15)]
16pub struct SingleToTriOp {
17    name: String,
18}
19
20impl SingleToTriOp {
21    pub fn new() -> Self {
22        Self { name: "SingleToTriOp".to_string() }
23    }
24
25    async fn run_op(&self, input0: &i32) -> NetResult<(i32, i32, i32)> {
26        let val = *input0;
27        let out0 = val;
28        let out1 = val + 10;
29        let out2 = val + 100;
30        info!("SingleToTriOp => in={}, out0={}, out1={}, out2={}", val, out0, out1, out2);
31        Ok((out0, out1, out2))
32    }
33}
34
35#[cfg(test)]
36mod single_to_tri_op_tests {
37    use super::*;
38
39    #[tokio::test]
40    async fn test_single_to_tri_op_basic() -> Result<(), NetworkError> {
41        let op = SingleToTriOp::new();
42        let input_val = SingleToTriOpIO::Input0(42);
43        let input = [Some(&input_val), None, None, None];
44        let mut out = [None, None, None, None];
45
46        op.execute(input, &mut out).await?;
47        assert_eq!(out[0], Some(SingleToTriOpIO::Output0(42)));
48        assert_eq!(out[1], Some(SingleToTriOpIO::Output1(52)));
49        assert_eq!(out[2], Some(SingleToTriOpIO::Output2(142)));
50        Ok(())
51    }
52
53    #[tokio::test]
54    async fn test_single_to_tri_op_zero() -> Result<(), NetworkError> {
55        let op = SingleToTriOp::new();
56        let input0 = SingleToTriOpIO::Input0(0);
57        let input = [Some(&input0), None, None, None];
58        let mut out = [None, None, None, None];
59
60        op.execute(input, &mut out).await?;
61        assert_eq!(out[0], Some(SingleToTriOpIO::Output0(0)));
62        assert_eq!(out[1], Some(SingleToTriOpIO::Output1(10)));
63        assert_eq!(out[2], Some(SingleToTriOpIO::Output2(100)));
64        Ok(())
65    }
66
67    #[tokio::test]
68    async fn test_single_to_tri_op_multiple() -> Result<(), NetworkError> {
69        let op = SingleToTriOp::new();
70        for x in [1, 2, 50, 100] {
71            let i0 = SingleToTriOpIO::Input0(x);
72            let input = [Some(&i0), None, None, None];
73            let mut out = [None, None, None, None];
74
75            op.execute(input, &mut out).await?;
76            assert_eq!(out[0], Some(SingleToTriOpIO::Output0(x)));
77            assert_eq!(out[1], Some(SingleToTriOpIO::Output1(x+10)));
78            assert_eq!(out[2], Some(SingleToTriOpIO::Output2(x+100)));
79        }
80        Ok(())
81    }
82}