hydro2_basic_operators/
multiply_op.rs1crate::ix!();
3
4#[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}