github_actions_expressions/
op.rs

1//! Unary and binary operators.
2
3/// Binary operations allowed in an expression.
4#[derive(Debug, PartialEq)]
5pub enum BinOp {
6    /// `expr && expr`
7    And,
8    /// `expr || expr`
9    Or,
10    /// `expr == expr`
11    Eq,
12    /// `expr != expr`
13    Neq,
14    /// `expr > expr`
15    Gt,
16    /// `expr >= expr`
17    Ge,
18    /// `expr < expr`
19    Lt,
20    /// `expr <= expr`
21    Le,
22}
23
24/// Unary operations allowed in an expression.
25#[derive(Debug, PartialEq)]
26pub enum UnOp {
27    /// `!expr`
28    Not,
29}
30
31#[cfg(test)]
32mod tests {
33    use crate::Expr;
34    use anyhow::Result;
35
36    #[test]
37    fn test_evaluate_constant_binary_operations() -> Result<()> {
38        use crate::Evaluation;
39
40        let test_cases = &[
41            // Boolean operations
42            ("true && true", Evaluation::Boolean(true)),
43            ("true && false", Evaluation::Boolean(false)),
44            ("false && true", Evaluation::Boolean(false)),
45            ("false && false", Evaluation::Boolean(false)),
46            ("true || true", Evaluation::Boolean(true)),
47            ("true || false", Evaluation::Boolean(true)),
48            ("false || true", Evaluation::Boolean(true)),
49            ("false || false", Evaluation::Boolean(false)),
50            // Equality operations
51            ("1 == 1", Evaluation::Boolean(true)),
52            ("1 == 2", Evaluation::Boolean(false)),
53            ("'hello' == 'hello'", Evaluation::Boolean(true)),
54            ("'hello' == 'world'", Evaluation::Boolean(false)),
55            ("true == true", Evaluation::Boolean(true)),
56            ("true == false", Evaluation::Boolean(false)),
57            ("1 != 2", Evaluation::Boolean(true)),
58            ("1 != 1", Evaluation::Boolean(false)),
59            // Comparison operations
60            ("1 < 2", Evaluation::Boolean(true)),
61            ("2 < 1", Evaluation::Boolean(false)),
62            ("1 <= 1", Evaluation::Boolean(true)),
63            ("1 <= 2", Evaluation::Boolean(true)),
64            ("2 <= 1", Evaluation::Boolean(false)),
65            ("2 > 1", Evaluation::Boolean(true)),
66            ("1 > 2", Evaluation::Boolean(false)),
67            ("1 >= 1", Evaluation::Boolean(true)),
68            ("2 >= 1", Evaluation::Boolean(true)),
69            ("1 >= 2", Evaluation::Boolean(false)),
70        ];
71
72        for (expr_str, expected) in test_cases {
73            let expr = Expr::parse(expr_str)?;
74            let result = expr.consteval().unwrap();
75            assert_eq!(result, *expected, "Failed for expression: {}", expr_str);
76        }
77
78        Ok(())
79    }
80}