use rhai::{Engine, EvalAltResult, INT}; #[test] fn test_binary_ops() -> Result<(), Box> { let engine = Engine::new(); assert_eq!(engine.eval::("10 + 4")?, 14); assert_eq!(engine.eval::("10 - 4")?, 6); assert_eq!(engine.eval::("10 * 4")?, 40); assert_eq!(engine.eval::("10 / 4")?, 2); assert_eq!(engine.eval::("10 % 4")?, 2); assert_eq!(engine.eval::("10 ** 4")?, 10000); assert_eq!(engine.eval::("10 << 4")?, 160); assert_eq!(engine.eval::("10 >> 4")?, 0); assert_eq!(engine.eval::("10 & 4")?, 0); assert_eq!(engine.eval::("10 | 4")?, 14); assert_eq!(engine.eval::("10 ^ 4")?, 14); assert!(engine.eval::("42 == 42")?); assert!(!engine.eval::("42 != 42")?); assert!(!engine.eval::("42 > 42")?); assert!(engine.eval::("42 >= 42")?); assert!(!engine.eval::("42 < 42")?); assert!(engine.eval::("42 <= 42")?); assert_eq!(engine.eval::("let x = 10; x += 4; x")?, 14); assert_eq!(engine.eval::("let x = 10; x -= 4; x")?, 6); assert_eq!(engine.eval::("let x = 10; x *= 4; x")?, 40); assert_eq!(engine.eval::("let x = 10; x /= 4; x")?, 2); assert_eq!(engine.eval::("let x = 10; x %= 4; x")?, 2); assert_eq!(engine.eval::("let x = 10; x **= 4; x")?, 10000); assert_eq!(engine.eval::("let x = 10; x <<= 4; x")?, 160); assert_eq!(engine.eval::("let x = 10; x <<= -1; x")?, 5); assert_eq!(engine.eval::("let x = 10; x >>= 4; x")?, 0); assert_eq!(engine.eval::("let x = 10; x >>= -2; x")?, 40); assert_eq!(engine.eval::("let x = 10; x &= 4; x")?, 0); assert_eq!(engine.eval::("let x = 10; x |= 4; x")?, 14); assert_eq!(engine.eval::("let x = 10; x ^= 4; x")?, 14); #[cfg(not(feature = "no_float"))] { use rhai::FLOAT; assert_eq!(engine.eval::("10.0 + 4.0")?, 14.0); assert_eq!(engine.eval::("10.0 - 4.0")?, 6.0); assert_eq!(engine.eval::("10.0 * 4.0")?, 40.0); assert_eq!(engine.eval::("10.0 / 4.0")?, 2.5); assert_eq!(engine.eval::("10.0 % 4.0")?, 2.0); assert_eq!(engine.eval::("10.0 ** 4.0")?, 10000.0); assert_eq!(engine.eval::("10.0 + 4")?, 14.0); assert_eq!(engine.eval::("10.0 - 4")?, 6.0); assert_eq!(engine.eval::("10.0 * 4")?, 40.0); assert_eq!(engine.eval::("10.0 / 4")?, 2.5); assert_eq!(engine.eval::("10.0 % 4")?, 2.0); assert_eq!(engine.eval::("10.0 ** 4")?, 10000.0); assert_eq!(engine.eval::("10 + 4.0")?, 14.0); assert_eq!(engine.eval::("10 - 4.0")?, 6.0); assert_eq!(engine.eval::("10 * 4.0")?, 40.0); assert_eq!(engine.eval::("10 / 4.0")?, 2.5); assert_eq!(engine.eval::("10 % 4.0")?, 2.0); assert_eq!(engine.eval::("10 ** 4.0")?, 10000.0); assert!(engine.eval::("42 == 42.0")?); assert!(!engine.eval::("42 != 42.0")?); assert!(!engine.eval::("42 > 42.0")?); assert!(engine.eval::("42 >= 42.0")?); assert!(!engine.eval::("42 < 42.0")?); assert!(engine.eval::("42 <= 42.0")?); assert!(engine.eval::("42.0 == 42")?); assert!(!engine.eval::("42.0 != 42")?); assert!(!engine.eval::("42.0 > 42")?); assert!(engine.eval::("42.0 >= 42")?); assert!(!engine.eval::("42.0 < 42")?); assert!(engine.eval::("42.0 <= 42")?); assert_eq!(engine.eval::("let x = 10.0; x += 4.0; x")?, 14.0); assert_eq!(engine.eval::("let x = 10.0; x -= 4.0; x")?, 6.0); assert_eq!(engine.eval::("let x = 10.0; x *= 4.0; x")?, 40.0); assert_eq!(engine.eval::("let x = 10.0; x /= 4.0; x")?, 2.5); assert_eq!(engine.eval::("let x = 10.0; x %= 4.0; x")?, 2.0); assert_eq!(engine.eval::("let x = 10.0; x **= 4.0; x")?, 10000.0); assert_eq!(engine.eval::("let x = 10.0; x += 4; x")?, 14.0); assert_eq!(engine.eval::("let x = 10.0; x -= 4; x")?, 6.0); assert_eq!(engine.eval::("let x = 10.0; x *= 4; x")?, 40.0); assert_eq!(engine.eval::("let x = 10.0; x /= 4; x")?, 2.5); assert_eq!(engine.eval::("let x = 10.0; x %= 4; x")?, 2.0); assert_eq!(engine.eval::("let x = 10.0; x **= 4; x")?, 10000.0); } assert_eq!( engine.eval::(r#""hello" + ", world""#)?, "hello, world" ); assert_eq!(engine.eval::(r#""hello" + '!'"#)?, "hello!"); assert_eq!(engine.eval::(r#""hello" - "el""#)?, "hlo"); assert_eq!(engine.eval::(r#""hello" - 'l'"#)?, "heo"); assert!(!engine.eval::(r#""a" == "x""#)?); assert!(engine.eval::(r#""a" != "x""#)?); assert!(!engine.eval::(r#""a" > "x""#)?); assert!(!engine.eval::(r#""a" >= "x""#)?); assert!(engine.eval::(r#""a" < "x""#)?); assert!(engine.eval::(r#""a" <= "x""#)?); assert!(engine.eval::(r#""x" == 'x'"#)?); assert!(!engine.eval::(r#""x" != 'x'"#)?); assert!(!engine.eval::(r#""x" > 'x'"#)?); assert!(engine.eval::(r#""x" >= 'x'"#)?); assert!(!engine.eval::(r#""x" < 'x'"#)?); assert!(engine.eval::(r#""x" <= 'x'"#)?); assert!(engine.eval::(r#"'x' == "x""#)?); assert!(!engine.eval::(r#"'x' != "x""#)?); assert!(!engine.eval::(r#"'x' > "x""#)?); assert!(engine.eval::(r#"'x' >= "x""#)?); assert!(!engine.eval::(r#"'x' < "x""#)?); assert!(engine.eval::(r#"'x' <= "x""#)?); // Incompatible types compare to false assert!(!engine.eval::("true == 42")?); assert!(engine.eval::("true != 42")?); assert!(!engine.eval::("true > 42")?); assert!(!engine.eval::("true >= 42")?); assert!(!engine.eval::("true < 42")?); assert!(!engine.eval::("true <= 42")?); assert!(!engine.eval::(r#""42" == 42"#)?); assert!(engine.eval::(r#""42" != 42"#)?); assert!(!engine.eval::(r#""42" > 42"#)?); assert!(!engine.eval::(r#""42" >= 42"#)?); assert!(!engine.eval::(r#""42" < 42"#)?); assert!(!engine.eval::(r#""42" <= 42"#)?); Ok(()) } #[test] fn test_binary_ops_null_coalesce() -> Result<(), Box> { let engine = Engine::new(); assert_eq!(engine.eval::("let x = 42; x ?? 123")?, 42); assert_eq!(engine.eval::("let x = (); x ?? 123")?, 123); Ok(()) }