#[macro_use]
extern crate rule;
use serde::Serialize;
use rule::{Rule, Result};
#[test]
fn rule_new() {
let _rule = Rule::new(json!(["=", "a", 1])).unwrap();
}
#[test]
fn rule_new_macro() {
let _rule = rule!["=", "a", 1].unwrap();
}
#[test]
fn rule_from_value() {
let _rule = Rule::from_value(["=", "world", "hello"]).unwrap();
}
#[test]
fn rule_from_str() {
let _rule = Rule::from_str(r#"["=", ["var", "a"], 1]"#).unwrap();
}
#[test]
fn rule_match() {
let _rule = Rule::new(json!(["=", "a", 1])).unwrap();
let context = json!({"a": 1, "world": "hello"});
assert!(_rule.matches(&context).unwrap());
}
#[test]
fn rule_match_handle_error() -> Result<()> {
let context = json!({"a": 1, "world": "hello"});
assert!(Rule::new(json!(["=", "a", 1]))?.matches(&context)?);
assert!(rule!["=", "a", 1]?.matches(&context)?);
Ok(())
}
#[test]
fn rule_recur_match() -> Result<()> {
let context = json!({"a": 1, "world": "hello"});
assert!(Rule::new(json!(["=", ["var", "a"], 1]))?.matches(&context)?);
Ok(())
}
#[test]
fn rule_match_from_str() -> Result<()>{
let context = json!({"a": 1, "world": "hello"});
assert!(Rule::from_str(r#"["=", ["var", "a"], 1]"#)?.matches(&context)?);
Ok(())
}
#[test]
fn rule_match_from_value() -> Result<()> {
let context = json!({"a": 1, "world": "hello"});
assert!(Rule::from_value(["=", "world", "hello"])?.matches(&context)?);
Ok(())
}
#[derive(Serialize, Clone, Debug)]
struct Context<'a> {
a: i32,
world: &'a str,
}
#[test]
fn rule_match_context_struct() -> Result<()>{
let context = Context { a: 1, world: "hello" };
assert!(Rule::new(json!(["=", "a", 1]))?.matches(&context)?);
assert!(Rule::new(json!(["=", "world", "hello"]))?.matches(&context)?);
Ok(())
}
#[test]
fn rule_match_logic_op() -> Result<()> {
let context = json!({"a": 1, "world": "hello"});
assert!(Rule::new(json!([">", "world", "hell"]))?.matches(&context)?);
assert!(Rule::new(json!([">", "a", 0]))?.matches(&context)?);
assert!(Rule::new(json!(["!", ["<", 1000, 234]]))?.matches(&context)?);
assert!(Rule::new(json!([">=", 1000, 234]))?.matches(&context)?);
assert!(Rule::new(json!(["!=", 1000, 234]))?.matches(&context)?);
assert!(Rule::new(json!(["all", 1000, 234, true]))?.matches(&context)?);
assert!(Rule::new(json!(["any", 1000, 0]))?.matches(&context)?);
assert_eq!(Rule::new(json!(["any", false, 0]))?.matches(&context)?, false);
Ok(())
}
#[test]
fn rule_match_arithmetic_op() -> Result<()> {
let context = json!({"a": 1, "world": "hello"});
assert!(Rule::new(json!(["=", ["+", "world", " world"], "hello world"]))?.matches(&context)?);
assert!(Rule::new(json!(["=", ["+", "a", 100], 101]))?.matches(&context)?);
assert!(Rule::new(json!(["=", ["-", "a", 100], -99]))?.matches(&context)?);
assert!(Rule::new(json!(["=", ["-", "10", 1], 9]))?.matches(&context)?);
assert!(Rule::new(json!(["=", ["neg", "10"], -10]))?.matches(&context)?);
assert!(Rule::new(json!(["=", ["*", "a", 10, -2], -20]))?.matches(&context)?);
assert!(Rule::new(json!(["=", ["/", 100, ["var", "a"], 5], 20]))?.matches(&context)?);
assert!(Rule::new(json!(["=", ["%", 100, 3], 1]))?.matches(&context)?);
assert!(Rule::new(json!(["=", ["abs", -123], 123]))?.matches(&json!({}))?);
Ok(())
}
#[test]
fn rule_match_collection_op() -> Result<()> {
assert!(rule!["in", 1, 1, 2, 3]?.matches(&json!({}))?);
assert!(rule!["startswith", "hello", "he"]?.matches(&json!({}))?);
assert!(rule!["startswith", "arr", "foo", "bar"]?.matches(&json!({"arr": ["foo", "bar", "baz"]}))?);
assert!(rule!["endswith", "arr", "bar", "baz"]?.matches(&json!({"arr": ["foo", "bar", "baz"]}))?);
assert!(rule!["startswith", ["split", "apple,pear", ","], "apple"]?.matches(&json!({}))?);
assert!(rule!["=", ["join", " ", "hello", "world"], "hello world"]?.matches(&json!({}))?);
Ok(())
}
#[test]
fn rule_match_string_op() -> Result<()> {
assert!(rule!["=", ["lower", "Hi"], "hi"]?.matches(&json!({}))?);
assert!(rule!["=", ["upper", "Hi"], "HI"]?.matches(&json!({}))?);
assert!(rule!["match", "hello", "he*"]?.matches(&json!({}))?);
assert!(rule!["regex", "hello", "^he[l-o]{3}$"]?.matches(&json!({}))?);
Ok(())
}
#[test]
fn rule_match_casting_op() -> Result<()> {
assert!(rule!["=", ["num", "100"], 100]?.matches(&json!({}))?);
assert!(rule!["=", ["num", "1.23"], 1.23]?.matches(&json!({}))?);
assert_eq!(rule!["=", "100", 100]?.matches(&json!({}))?, false);
assert!(rule!["=", ["string", 100], "100"]?.matches(&json!({}))?);
Ok(())
}