use serde_json::json;
use xqpath::{evaluate_path_expression, parse_path_expression, PathExpression};
#[test]
fn test_builtin_functions() {
let data = json!({
"users": [
{"name": "Alice", "age": 30},
{"name": "Bob", "age": 25}
],
"name": "Test Company"
});
let expr = parse_path_expression(".users | length()").unwrap();
let result = evaluate_path_expression(&expr, &data).unwrap();
assert_eq!(result, vec![json!(2)]);
let expr = parse_path_expression(".name | length()").unwrap();
let result = evaluate_path_expression(&expr, &data).unwrap();
assert_eq!(result, vec![json!(12)]);
let expr = parse_path_expression(".users | type()").unwrap();
let result = evaluate_path_expression(&expr, &data).unwrap();
assert_eq!(result, vec![json!("array")]);
let expr = parse_path_expression(".name | type()").unwrap();
let result = evaluate_path_expression(&expr, &data).unwrap();
assert_eq!(result, vec![json!("string")]);
let expr = parse_path_expression(". | keys()").unwrap();
let result = evaluate_path_expression(&expr, &data).unwrap();
assert_eq!(result, vec![json!(["name", "users"])]);
let simple_obj = json!({"a": 1, "b": 2});
let expr = parse_path_expression(". | values()").unwrap();
let result = evaluate_path_expression(&expr, &simple_obj).unwrap();
let values_array = result[0].as_array().unwrap();
assert_eq!(values_array.len(), 2);
assert!(values_array.contains(&json!(1)));
assert!(values_array.contains(&json!(2)));
}
#[test]
fn test_function_call_parsing() {
let expr = parse_path_expression("length()").unwrap();
if let PathExpression::FunctionCall { name, args } = expr {
assert_eq!(name, "length");
assert_eq!(args.len(), 0);
} else {
panic!("Expected function call");
}
let expr = parse_path_expression(".users | length()").unwrap();
if let PathExpression::Pipe { left: _, right } = expr {
if let PathExpression::FunctionCall { name, args } = *right {
assert_eq!(name, "length");
assert_eq!(args.len(), 0);
} else {
panic!("Expected function call in pipe");
}
} else {
panic!("Expected pipe expression");
}
}
#[test]
fn test_function_error_handling() {
let data = json!({"name": "test"});
let expr = parse_path_expression("unknown_function()").unwrap();
let result = evaluate_path_expression(&expr, &data);
assert!(result.is_err());
let expr = parse_path_expression("length(\"arg\")").unwrap();
let result = evaluate_path_expression(&expr, &data);
assert!(result.is_err());
let expr = parse_path_expression("42 | length()").unwrap();
let result = evaluate_path_expression(&expr, &data);
assert!(result.is_err());
}