celq 0.4.0

A CEL command-line query tool for JSON data
Documentation
use super::*;

#[test]
fn test_int() {
    let args = vec![("x".to_string(), "int".to_string(), "42".to_string())];
    let vars = args_to_cel_variables(&args).unwrap();
    assert!(matches!(vars.get("x").unwrap(), CelValue::Int(42)));
}

#[test]
fn test_uint() {
    let args = vec![("x".to_string(), "uint".to_string(), "42".to_string())];
    let vars = args_to_cel_variables(&args).unwrap();
    assert!(matches!(vars.get("x").unwrap(), CelValue::UInt(42)));
}

#[test]
fn test_float() {
    let args = vec![("x".to_string(), "float".to_string(), "1.23".to_string())];
    let vars = args_to_cel_variables(&args).unwrap();
    if let CelValue::Float(f) = vars.get("x").unwrap() {
        assert!((f - 1.23).abs() < 0.001);
    } else {
        panic!("Expected float");
    }
}

#[test]
fn test_string() {
    let args = vec![("x".to_string(), "string".to_string(), "hello".to_string())];
    let vars = args_to_cel_variables(&args).unwrap();
    if let CelValue::String(s) = vars.get("x").unwrap() {
        assert_eq!(s.as_str(), "hello");
    } else {
        panic!("Expected string");
    }
}

#[test]
fn test_bool() {
    let args = vec![("x".to_string(), "bool".to_string(), "true".to_string())];
    let vars = args_to_cel_variables(&args).unwrap();
    assert!(matches!(vars.get("x").unwrap(), CelValue::Bool(true)));
}

#[test]
fn test_alias_types() {
    let args = vec![
        ("x".to_string(), "i64".to_string(), "42".to_string()),
        ("y".to_string(), "u64".to_string(), "7".to_string()),
        ("z".to_string(), "double".to_string(), "2.5".to_string()),
        ("w".to_string(), "boolean".to_string(), "false".to_string()),
        ("s".to_string(), "str".to_string(), "hello".to_string()),
    ];
    let vars = args_to_cel_variables(&args).unwrap();

    assert!(matches!(vars.get("x").unwrap(), CelValue::Int(42)));
    assert!(matches!(vars.get("y").unwrap(), CelValue::UInt(7)));
    assert!(matches!(vars.get("z").unwrap(), CelValue::Float(f) if (*f - 2.5).abs() < 0.001));
    assert!(matches!(vars.get("w").unwrap(), CelValue::Bool(false)));
    assert!(matches!(vars.get("s").unwrap(), CelValue::String(s) if s.as_str() == "hello"));
}

#[test]
fn test_duplicate_args_last_wins() {
    let args = vec![
        ("x".to_string(), "int".to_string(), "1".to_string()),
        ("x".to_string(), "int".to_string(), "2".to_string()),
    ];
    let vars = args_to_cel_variables(&args).unwrap();
    assert_eq!(vars.len(), 1);
    assert!(matches!(vars.get("x").unwrap(), CelValue::Int(2)));
}

#[test]
fn test_multiple_args() {
    let args = vec![
        ("x".to_string(), "int".to_string(), "10".to_string()),
        ("y".to_string(), "string".to_string(), "test".to_string()),
        ("z".to_string(), "bool".to_string(), "false".to_string()),
    ];
    let vars = args_to_cel_variables(&args).unwrap();
    assert_eq!(vars.len(), 3);
    assert!(matches!(vars.get("x").unwrap(), CelValue::Int(10)));
    assert!(matches!(vars.get("z").unwrap(), CelValue::Bool(false)));
}

#[test]
fn test_unsupported_type() {
    let args = vec![("x".to_string(), "list".to_string(), "[]".to_string())];
    let result = args_to_cel_variables(&args);
    assert!(result.is_err());
    let err_msg = result.unwrap_err().to_string();
    assert!(err_msg.contains("Unsupported type"));
}

#[test]
fn test_parse_error() {
    let args = vec![(
        "x".to_string(),
        "int".to_string(),
        "not_a_number".to_string(),
    )];
    let result = args_to_cel_variables(&args);
    assert!(result.is_err());
    let err_msg = result.unwrap_err().to_string();
    assert!(err_msg.contains("Failed to parse argument 'x'"));
}