hydro2_basic_operators/
merge2_op.rs1crate::ix!();
3
4#[derive(NamedItem, Operator, Debug)]
8#[operator(
9 execute="merge_op",
10 opcode="BasicOpCode::Merge2Op",
11 input0="i32",
12 input1="i32",
13 output0="i32"
14)]
15pub struct Merge2Op {
16 name: String,
17}
18
19impl Default for Merge2Op {
20 fn default() -> Self {
21 Self { name: "Merge2Op".to_string() }
22 }
23}
24
25impl Merge2Op {
26
27 async fn merge_op(&self, a: &i32, b: &i32) -> NetResult<i32> {
28 let sum = *a + *b;
29 info!("Merge2Op => a={}, b={}, sum={}", a, b, sum);
30 Ok(sum)
31 }
32}
33
34#[cfg(test)]
35mod merge2_op_tests {
36 use super::*;
37
38 #[tokio::test]
39 async fn test_merge2_op_basic() -> Result<(), NetworkError> {
40 let op = Merge2Op::default();
41 let i0 = Merge2OpIO::Input0(12);
42 let i1 = Merge2OpIO::Input1(8);
43 let input = [Some(&i0), Some(&i1), None, None];
44 let mut out = [None,None,None,None];
45 op.execute(input, &mut out).await?;
46 assert_eq!(out[0], Some(Merge2OpIO::Output0(20)));
47 Ok(())
48 }
49
50 #[tokio::test]
51 async fn test_merge2_op_negatives() -> Result<(), NetworkError> {
52 let op = Merge2Op::default();
53 let in0 = Merge2OpIO::Input0(-5);
54 let in1 = Merge2OpIO::Input1(-10);
55 let input = [Some(&in0), Some(&in1), None, None];
56 let mut out = [None,None,None,None];
57 op.execute(input, &mut out).await?;
58 assert_eq!(out[0], Some(Merge2OpIO::Output0(-15)));
59 Ok(())
60 }
61}