107 lines
3 KiB
Rust
107 lines
3 KiB
Rust
|
|
//! Unit tests for infix operator parsing within expressions.
|
||
|
|
|
||
|
|
use crate::{ArithOp, Datum, Expr, InfixOp};
|
||
|
|
|
||
|
|
#[test]
|
||
|
|
fn add_op_parses() {
|
||
|
|
assert_eq!(
|
||
|
|
// https://xkcd.com/3184/
|
||
|
|
Expr::try_from("six + 7"),
|
||
|
|
Ok(Expr::Infix {
|
||
|
|
lhs: Box::new(Expr::ObjName(vec!["six".to_owned()])),
|
||
|
|
op: InfixOp::ArithInfix(ArithOp::Add),
|
||
|
|
rhs: Box::new(Expr::Literal(Datum::Numeric(Some(7.into())))),
|
||
|
|
})
|
||
|
|
);
|
||
|
|
}
|
||
|
|
|
||
|
|
#[test]
|
||
|
|
fn mult_op_parses() {
|
||
|
|
assert_eq!(
|
||
|
|
Expr::try_from("six * 7"),
|
||
|
|
Ok(Expr::Infix {
|
||
|
|
lhs: Box::new(Expr::ObjName(vec!["six".to_owned()])),
|
||
|
|
op: InfixOp::ArithInfix(ArithOp::Mult),
|
||
|
|
rhs: Box::new(Expr::Literal(Datum::Numeric(Some(7.into())))),
|
||
|
|
})
|
||
|
|
);
|
||
|
|
}
|
||
|
|
|
||
|
|
#[test]
|
||
|
|
fn arith_precedence() {
|
||
|
|
assert_eq!(
|
||
|
|
Expr::try_from("(1 + 2) * 3 + 4"),
|
||
|
|
Ok(Expr::Infix {
|
||
|
|
lhs: Box::new(Expr::Infix {
|
||
|
|
lhs: Box::new(Expr::Infix {
|
||
|
|
lhs: Box::new(Expr::Literal(Datum::Numeric(Some(1.into())))),
|
||
|
|
op: InfixOp::ArithInfix(ArithOp::Add),
|
||
|
|
rhs: Box::new(Expr::Literal(Datum::Numeric(Some(2.into())))),
|
||
|
|
}),
|
||
|
|
op: InfixOp::ArithInfix(ArithOp::Mult),
|
||
|
|
rhs: Box::new(Expr::Literal(Datum::Numeric(Some(3.into())))),
|
||
|
|
}),
|
||
|
|
op: InfixOp::ArithInfix(ArithOp::Add),
|
||
|
|
rhs: Box::new(Expr::Literal(Datum::Numeric(Some(4.into())))),
|
||
|
|
})
|
||
|
|
);
|
||
|
|
assert_eq!(
|
||
|
|
Expr::try_from("1 - 2 / (3 - 4)"),
|
||
|
|
Ok(Expr::Infix {
|
||
|
|
lhs: Box::new(Expr::Literal(Datum::Numeric(Some(1.into())))),
|
||
|
|
op: InfixOp::ArithInfix(ArithOp::Sub),
|
||
|
|
rhs: Box::new(Expr::Infix {
|
||
|
|
lhs: Box::new(Expr::Literal(Datum::Numeric(Some(2.into())))),
|
||
|
|
op: InfixOp::ArithInfix(ArithOp::Div),
|
||
|
|
rhs: Box::new(Expr::Infix {
|
||
|
|
lhs: Box::new(Expr::Literal(Datum::Numeric(Some(3.into())))),
|
||
|
|
op: InfixOp::ArithInfix(ArithOp::Sub),
|
||
|
|
rhs: Box::new(Expr::Literal(Datum::Numeric(Some(4.into())))),
|
||
|
|
}),
|
||
|
|
})
|
||
|
|
})
|
||
|
|
);
|
||
|
|
}
|
||
|
|
|
||
|
|
#[test]
|
||
|
|
fn is_null_parses() {
|
||
|
|
assert_eq!(
|
||
|
|
Expr::try_from("my_var is null"),
|
||
|
|
Ok(Expr::Nullness {
|
||
|
|
is_null: true,
|
||
|
|
expr: Box::new(Expr::ObjName(vec!["my_var".to_owned()]))
|
||
|
|
}),
|
||
|
|
);
|
||
|
|
}
|
||
|
|
|
||
|
|
#[test]
|
||
|
|
fn is_not_null_parses() {
|
||
|
|
assert_eq!(
|
||
|
|
Expr::try_from("my_var is not null"),
|
||
|
|
Ok(Expr::Nullness {
|
||
|
|
is_null: false,
|
||
|
|
expr: Box::new(Expr::ObjName(vec!["my_var".to_owned()]))
|
||
|
|
}),
|
||
|
|
);
|
||
|
|
}
|
||
|
|
|
||
|
|
#[test]
|
||
|
|
fn not_parses() {
|
||
|
|
assert_eq!(
|
||
|
|
Expr::try_from("not my_var"),
|
||
|
|
Ok(Expr::Not(Box::new(Expr::ObjName(vec![
|
||
|
|
"my_var".to_owned()
|
||
|
|
])))),
|
||
|
|
);
|
||
|
|
}
|
||
|
|
|
||
|
|
#[test]
|
||
|
|
fn repeated_nots_parse() {
|
||
|
|
assert_eq!(
|
||
|
|
Expr::try_from("not not my_var"),
|
||
|
|
Ok(Expr::Not(Box::new(Expr::Not(Box::new(Expr::ObjName(
|
||
|
|
vec!["my_var".to_owned()]
|
||
|
|
)))))),
|
||
|
|
);
|
||
|
|
}
|