#[cfg(test)] mod test { use crate::assignments::assignment04::syntax::*; use crate::assignments::assignment04::*; #[test] fn test_parse() { assert_eq!( parser::parse_command("$1 = (132 + 77) * 3 ^ 8").unwrap(), Command { variable: Some("$1".into()), expression: Expression::BinOp { op: BinOp::Multiply, lhs: Expression::BinOp { op: BinOp::Add, lhs: Expression::Num(132.0).into(), rhs: Expression::Num(77.0).into(), } .into(), rhs: Expression::BinOp { op: BinOp::Power, lhs: Expression::Num(3.0).into(), rhs: Expression::Num(8.0).into(), } .into(), } } ); assert_eq!( parser::parse_command("132 + 77").unwrap(), Command { variable: None, expression: Expression::BinOp { op: BinOp::Add, lhs: Expression::Num(132.0).into(), rhs: Expression::Num(77.0).into(), } } ); assert_eq!( parser::parse_command("v2 = 132 + 77").unwrap(), Command { variable: Some("v2".into()), expression: Expression::BinOp { op: BinOp::Add, lhs: Expression::Num(132.0).into(), rhs: Expression::Num(77.0).into(), } } ); assert!(parser::parse_command("132 +!s 77").is_err()); assert_eq!( parser::parse_command("12 - 34 + 23 ^ 4").unwrap(), Command { variable: None, expression: Expression::BinOp { op: BinOp::Add, lhs: Expression::BinOp { op: BinOp::Subtract, lhs: Expression::Num(12.0).into(), rhs: Expression::Num(34.0).into(), } .into(), rhs: Expression::BinOp { op: BinOp::Power, lhs: Expression::Num(23.0).into(), rhs: Expression::Num(4.0).into(), } .into(), }, } ); } #[test] fn test_context_calc_expression() { let ctx = context::Context::new(); // "(132 + 77) * 3 ^ 8" assert_eq!( ctx.calc_expression(&Expression::BinOp { op: BinOp::Multiply, lhs: Expression::BinOp { op: BinOp::Add, lhs: Expression::Num(132.0).into(), rhs: Expression::Num(77.0).into(), } .into(), rhs: Expression::BinOp { op: BinOp::Power, lhs: Expression::Num(3.0).into(), rhs: Expression::Num(8.0).into(), } .into(), }) .expect("calculate expression is failed"), 1371249.0 ); // "132 + 77" assert_eq!( ctx.calc_expression(&Expression::BinOp { op: BinOp::Add, lhs: Expression::Num(132.0).into(), rhs: Expression::Num(77.0).into(), }) .expect("calculate expression is failed"), 209.0 ); // "v + 77" assert!(ctx .calc_expression(&Expression::BinOp { op: BinOp::Add, lhs: Expression::Variable("v".into()).into(), rhs: Expression::Num(77.0).into(), }) .is_err()); // "3 / (3 * 4 - 12)" assert!(ctx .calc_expression(&Expression::BinOp { op: BinOp::Divide, lhs: Expression::Num(3.0).into(), rhs: Expression::BinOp { op: BinOp::Subtract, lhs: Expression::BinOp { op: BinOp::Multiply, lhs: Expression::Num(3.0).into(), rhs: Expression::Num(4.0).into(), } .into(), rhs: Expression::Num(12.0).into(), } .into(), }) .is_err()); // "12 - 34 + 23 ^ 4" assert_eq!( ctx.calc_expression(&Expression::BinOp { op: BinOp::Add, lhs: Expression::BinOp { op: BinOp::Subtract, lhs: Expression::Num(12.0).into(), rhs: Expression::Num(34.0).into(), } .into(), rhs: Expression::BinOp { op: BinOp::Power, lhs: Expression::Num(23.0).into(), rhs: Expression::Num(4.0).into(), } .into(), },) .expect("calculate expression is failed"), 279819.0 ); } #[test] fn test_context_calc_command() { let mut ctx = context::Context::new(); // "v1 = 132 + 77" assert_eq!( ctx.calc_command(&Command { variable: Some("v1".into()), expression: Expression::BinOp { op: BinOp::Add, lhs: Expression::Num(132.0).into(), rhs: Expression::Num(77.0).into(), } }) .unwrap(), ("v1".into(), 209.0) ); // "1 - 3 + 2 ^ 4" assert_eq!( ctx.calc_command(&Command { variable: None, expression: Expression::BinOp { op: BinOp::Add, lhs: Expression::BinOp { op: BinOp::Subtract, lhs: Expression::Num(1.0).into(), rhs: Expression::Num(3.0).into(), } .into(), rhs: Expression::BinOp { op: BinOp::Power, lhs: Expression::Num(2.0).into(), rhs: Expression::Num(4.0).into(), } .into(), }, }) .unwrap(), ("$0".into(), 14.0) ); // "v2 = v1 * 3 + $0" assert_eq!( ctx.calc_command(&Command { variable: Some("v2".into()), expression: Expression::BinOp { op: BinOp::Add, lhs: Expression::BinOp { op: BinOp::Multiply, lhs: Expression::Variable("v1".into()).into(), rhs: Expression::Num(3.0).into(), } .into(), rhs: Expression::Variable("$0".into()).into() } }) .unwrap(), ("v2".into(), 641.0) ); // "5 / 2" assert_eq!( ctx.calc_command(&Command { variable: None, expression: Expression::BinOp { op: BinOp::Divide, lhs: Expression::Num(5.0).into(), rhs: Expression::Num(2.0).into(), }, }) .unwrap(), ("$1".into(), 2.5) ); // "v2 = v2 ^ 2" assert_eq!( ctx.calc_command(&Command { variable: Some("v2".into()), expression: Expression::BinOp { op: BinOp::Power, lhs: Expression::Variable("v2".into()).into(), rhs: Expression::Num(2.0).into(), } }) .unwrap(), ("v2".into(), 410881.0) ); // "v2 = v2 - $1" assert_eq!( ctx.calc_command(&Command { variable: Some("v2".into()), expression: Expression::BinOp { op: BinOp::Subtract, lhs: Expression::Variable("v2".into()).into(), rhs: Expression::Variable("$1".into()).into(), } }) .unwrap(), ("v2".into(), 410878.5) ); // "v2 = v2 / $3" assert!(ctx .calc_command(&Command { variable: Some("v2".into()), expression: Expression::BinOp { op: BinOp::Divide, lhs: Expression::Variable("v2".into()).into(), rhs: Expression::Variable("$3".into()).into(), } }) .is_err()); // "v3 = 3 / (3 * 4 - 12)" assert!(ctx .calc_command(&Command { variable: Some("v3".into()), expression: Expression::BinOp { op: BinOp::Divide, lhs: Expression::Num(3.0).into(), rhs: Expression::BinOp { op: BinOp::Subtract, lhs: Expression::BinOp { op: BinOp::Multiply, lhs: Expression::Num(3.0).into(), rhs: Expression::Num(4.0).into(), } .into(), rhs: Expression::Num(12.0).into(), } .into(), } }) .is_err()); // v3 = v3 - v2 assert!(ctx .calc_command(&Command { variable: Some("v3".into()), expression: Expression::BinOp { op: BinOp::Subtract, lhs: Expression::Variable("v3".into()).into(), rhs: Expression::Variable("v2".into()).into(), } }) .is_err()); } }