github_actions_expressions/
op.rs1use crate::SpannedExpr;
4
5#[derive(Debug, PartialEq)]
7pub enum BinOp {
8 And,
10 Or,
12 Eq,
14 Neq,
16 Gt,
18 Ge,
20 Lt,
22 Le,
24}
25
26#[derive(Debug, PartialEq)]
30pub struct BinExpr<'src> {
31 pub lhs: Box<SpannedExpr<'src>>,
33 pub op: BinOp,
35 pub rhs: Box<SpannedExpr<'src>>,
37}
38
39#[derive(Debug, PartialEq)]
41pub enum UnOp {
42 Not,
44}
45
46#[cfg(test)]
47mod tests {
48 use crate::{Error, Expr};
49
50 #[test]
51 fn test_evaluate_constant_binary_operations() -> Result<(), Error> {
52 use crate::Evaluation;
53
54 let test_cases = &[
55 ("true && true", Evaluation::Boolean(true)),
57 ("true && false", Evaluation::Boolean(false)),
58 ("false && true", Evaluation::Boolean(false)),
59 ("false && false", Evaluation::Boolean(false)),
60 ("true || true", Evaluation::Boolean(true)),
61 ("true || false", Evaluation::Boolean(true)),
62 ("false || true", Evaluation::Boolean(true)),
63 ("false || false", Evaluation::Boolean(false)),
64 ("1 == 1", Evaluation::Boolean(true)),
66 ("1 == 2", Evaluation::Boolean(false)),
67 ("'hello' == 'hello'", Evaluation::Boolean(true)),
68 ("'hello' == 'world'", Evaluation::Boolean(false)),
69 ("true == true", Evaluation::Boolean(true)),
70 ("true == false", Evaluation::Boolean(false)),
71 ("1 != 2", Evaluation::Boolean(true)),
72 ("1 != 1", Evaluation::Boolean(false)),
73 ("1 < 2", Evaluation::Boolean(true)),
75 ("2 < 1", Evaluation::Boolean(false)),
76 ("1 <= 1", Evaluation::Boolean(true)),
77 ("1 <= 2", Evaluation::Boolean(true)),
78 ("2 <= 1", Evaluation::Boolean(false)),
79 ("2 > 1", Evaluation::Boolean(true)),
80 ("1 > 2", Evaluation::Boolean(false)),
81 ("1 >= 1", Evaluation::Boolean(true)),
82 ("2 >= 1", Evaluation::Boolean(true)),
83 ("1 >= 2", Evaluation::Boolean(false)),
84 ];
85
86 for (expr_str, expected) in test_cases {
87 let expr = Expr::parse(expr_str)?;
88 let result = expr.consteval().unwrap();
89 assert_eq!(result, *expected, "Failed for expression: {}", expr_str);
90 }
91
92 Ok(())
93 }
94
95 #[test]
96 fn test_cross_type_comparison_with_whitespace() -> Result<(), Error> {
97 use crate::Evaluation;
98
99 let test_cases = &[
100 ("' 1 ' == 1", Evaluation::Boolean(true)),
102 ("' 42 ' == 42", Evaluation::Boolean(true)),
103 ("' 0 ' == 0", Evaluation::Boolean(true)),
104 ("' 3.14 ' == 3.14", Evaluation::Boolean(true)),
105 ("' 1 ' != 1", Evaluation::Boolean(false)),
106 ("' 2 ' < 3", Evaluation::Boolean(true)),
107 ("' 5 ' > 3", Evaluation::Boolean(true)),
108 ];
109
110 for (expr_str, expected) in test_cases {
111 let expr = Expr::parse(expr_str)?;
112 let result = expr.consteval().unwrap();
113 assert_eq!(result, *expected, "Failed for expression: {}", expr_str);
114 }
115
116 Ok(())
117 }
118}