hydro2_basic_operators/
multiply_op.rs

1// ---------------- [ File: src/multiply_op.rs ]
2crate::ix!();
3
4// --------------------------------------
5// MultiplyOp
6// --------------------------------------
7#[derive(NamedItem, Operator, Debug)]
8#[operator(
9    execute="multiplier",
10    opcode="BasicOpCode::MultiplyOp",
11    input0="i32",
12    output0="i32"
13)]
14pub struct MultiplyOp {
15    name: String,
16    factor: i32,
17}
18
19impl MultiplyOp {
20    pub fn new(f: i32) -> Self {
21        Self {
22            name: format!("MultiplyOp(x{})", f),
23            factor: f,
24        }
25    }
26
27    async fn multiplier(&self, input0: &i32) -> NetResult<i32> {
28        info!("MultiplyOp => in={}, factor={}", input0, self.factor);
29        Ok(*input0 * self.factor)
30    }
31}
32
33#[cfg(test)]
34mod multiply_op_tests {
35    use super::*;
36
37    #[tokio::test]
38    async fn test_multiply_op_basic() -> Result<(), NetworkError> {
39        let mul = MultiplyOp::new(3);
40        let i0 = MultiplyOpIO::Input0(10);
41        let input = [Some(&i0), None, None, None];
42        let mut out = [None,None,None,None];
43        mul.execute(input, &mut out).await?;
44        assert_eq!(out[0], Some(MultiplyOpIO::Output0(30)));
45        Ok(())
46    }
47
48    #[tokio::test]
49    async fn test_multiply_op_zero() -> Result<(), NetworkError> {
50        let mul = MultiplyOp::new(0);
51        let i0 = MultiplyOpIO::Input0(999);
52        let input = [Some(&i0), None, None, None];
53        let mut out = [None,None,None,None];
54        mul.execute(input, &mut out).await?;
55        assert_eq!(out[0], Some(MultiplyOpIO::Output0(0)));
56        Ok(())
57    }
58
59    #[tokio::test]
60    async fn test_multiply_op_negative() -> Result<(), NetworkError> {
61        let mul = MultiplyOp::new(-2);
62        let i0 = MultiplyOpIO::Input0(10);
63        let input = [Some(&i0), None, None, None];
64        let mut out = [None,None,None,None];
65        mul.execute(input, &mut out).await?;
66        assert_eq!(out[0], Some(MultiplyOpIO::Output0(-20)));
67        Ok(())
68    }
69}