hydro2_basic_operators/
failing_operator.rs

1// ---------------- [ File: src/failing_operator.rs ]
2crate::ix!();
3
4// --------------------------------------
5// FailingOperator<T>
6// --------------------------------------
7#[derive(NamedItem, Operator, Debug)]
8#[operator(execute="fail_now", opcode="BasicOpCode::FailingOp")]
9pub struct FailingOperator
10{
11    name:   String,
12    reason: String,
13}
14
15impl FailingOperator
16{
17    pub fn new(name: impl AsRef<str>, reason: impl AsRef<str>) -> Self {
18        Self {
19            name:   name.as_ref().to_string(),
20            reason: reason.as_ref().to_string(),
21        }
22    }
23
24    async fn fail_now(&self) -> NetResult<()> {
25        Err(NetworkError::OperatorFailed {
26            reason: self.reason.clone()
27        })
28    }
29}
30
31impl Default for FailingOperator
32{
33    fn default() -> Self {
34        Self {
35            name:   "failing_op".into(),
36            reason: "default fail reason".into(),
37        }
38    }
39}
40
41#[cfg(test)]
42mod failing_operator_tests {
43    use super::*;
44
45    #[tokio::test]
46    async fn test_failing_operator_default() -> Result<(), NetworkError> {
47        let fail = FailingOperator::default();
48        let input: [Option<&FailingOperatorIO>;4] = [None,None,None,None];
49        let mut out: [Option<FailingOperatorIO>;4] = [None,None,None,None];
50
51        let res = fail.execute(input, &mut out).await;
52        assert!(res.is_err());
53        if let Err(NetworkError::OperatorFailed { reason }) = res {
54            assert_eq!(reason, "default fail reason");
55        } else {
56            panic!("expected OperatorFailed");
57        }
58        Ok(())
59    }
60
61    #[tokio::test]
62    async fn test_failing_operator_custom() -> Result<(), NetworkError> {
63        let fail = FailingOperator::new("myfail", "some reason");
64        let input = [None, None, None, None];
65        let mut out = [None,None,None,None];
66        let err = fail.execute(input, &mut out).await.unwrap_err();
67        match err {
68            NetworkError::OperatorFailed { reason } => {
69                assert_eq!(reason, "some reason");
70            }
71            _ => panic!("Expected OperatorFailed"),
72        }
73        Ok(())
74    }
75}