use serde_json::json;
use tellaro_query_language::Tql;
#[test]
fn test_empty_array_any_equality() {
let tql = Tql::new();
let data = vec![
json!({"id": 1, "tags": []}),
json!({"id": 2, "tags": ["python", "rust"]}),
json!({"id": 3, "tags": ["javascript"]}),
];
let results = tql
.query(&data, "any tags eq 'python'")
.expect("Query should succeed");
assert_eq!(results.len(), 1);
assert_eq!(results[0]["id"], 2);
}
#[test]
fn test_empty_array_none_inequality() {
let tql = Tql::new();
let data = vec![
json!({"id": 1, "tags": []}),
json!({"id": 2, "tags": ["python", "rust"]}),
json!({"id": 3, "tags": ["javascript"]}),
];
let results = tql
.query(&data, "none tags eq 'python'")
.expect("Query should succeed");
assert_eq!(results.len(), 2);
let ids: Vec<i64> = results.iter().filter_map(|r| r["id"].as_i64()).collect();
assert!(ids.contains(&1));
assert!(ids.contains(&3));
}
#[test]
fn test_empty_array_any_greater_than() {
let tql = Tql::new();
let data = vec![
json!({"id": 1, "scores": []}),
json!({"id": 2, "scores": [50, 75]}),
json!({"id": 3, "scores": [25]}),
];
let results = tql
.query(&data, "any scores gt 60")
.expect("Query should succeed");
assert_eq!(results.len(), 1);
assert_eq!(results[0]["id"], 2);
}
#[test]
fn test_empty_array_any_less_than() {
let tql = Tql::new();
let data = vec![
json!({"id": 1, "scores": []}),
json!({"id": 2, "scores": [50, 75]}),
json!({"id": 3, "scores": [25]}),
];
let results = tql
.query(&data, "any scores lt 60")
.expect("Query should succeed");
assert_eq!(results.len(), 2);
let ids: Vec<i64> = results.iter().filter_map(|r| r["id"].as_i64()).collect();
assert!(ids.contains(&2));
assert!(ids.contains(&3));
}
#[test]
fn test_empty_array_any_contains() {
let tql = Tql::new();
let data = vec![
json!({"id": 1, "tags": []}),
json!({"id": 2, "tags": ["python", "rust"]}),
json!({"id": 3, "tags": ["javascript"]}),
];
let results = tql
.query(&data, "any tags contains 'py'")
.expect("Query should succeed");
assert_eq!(results.len(), 1);
assert_eq!(results[0]["id"], 2);
}
#[test]
fn test_empty_array_any_startswith() {
let tql = Tql::new();
let data = vec![
json!({"id": 1, "tags": []}),
json!({"id": 2, "tags": ["python", "rust"]}),
json!({"id": 3, "tags": ["javascript"]}),
];
let results = tql
.query(&data, "any tags startswith 'py'")
.expect("Query should succeed");
assert_eq!(results.len(), 1);
assert_eq!(results[0]["id"], 2);
}
#[test]
fn test_empty_array_any_endswith() {
let tql = Tql::new();
let data = vec![
json!({"id": 1, "tags": []}),
json!({"id": 2, "tags": ["python", "rust"]}),
json!({"id": 3, "tags": ["javascript"]}),
];
let results = tql
.query(&data, "any tags endswith 'on'")
.expect("Query should succeed");
assert_eq!(results.len(), 1);
assert_eq!(results[0]["id"], 2);
}
#[test]
fn test_empty_array_collection_any_operator() {
let tql = Tql::new();
let data = vec![
json!({"id": 1, "tags": []}),
json!({"id": 2, "tags": ["python", "rust"]}),
json!({"id": 3, "tags": ["javascript"]}),
];
let results = tql
.query(&data, "any tags eq 'python'")
.expect("Query should succeed");
assert_eq!(results.len(), 1);
assert_eq!(results[0]["id"], 2);
}
#[test]
fn test_empty_array_collection_all_operator() {
let tql = Tql::new();
let data = vec![
json!({"id": 1, "tags": []}),
json!({"id": 2, "tags": ["python", "rust"]}),
json!({"id": 3, "tags": ["javascript"]}),
];
let results = tql
.query(&data, "all tags eq 'python'")
.expect("Query should succeed");
assert_eq!(results.len(), 0);
}
#[test]
fn test_empty_array_collection_none_operator() {
let tql = Tql::new();
let data = vec![
json!({"id": 1, "tags": []}),
json!({"id": 2, "tags": ["python", "rust"]}),
json!({"id": 3, "tags": ["javascript"]}),
];
let results = tql
.query(&data, "none tags eq 'python'")
.expect("Query should succeed");
assert_eq!(results.len(), 2);
let ids: Vec<i64> = results.iter().filter_map(|r| r["id"].as_i64()).collect();
assert!(ids.contains(&1));
assert!(ids.contains(&3));
}
#[test]
fn test_empty_array_exists() {
let tql = Tql::new();
let data = vec![
json!({"id": 1, "tags": []}),
json!({"id": 2, "tags": ["python", "rust"]}),
json!({"id": 3, "tags": ["javascript"]}),
];
let results = tql
.query(&data, "tags exists")
.expect("Query should succeed");
assert_eq!(results.len(), 3);
}
#[test]
fn test_empty_array_not_exists() {
let tql = Tql::new();
let data = vec![
json!({"id": 1, "tags": []}),
json!({"id": 2, "tags": ["python", "rust"]}),
json!({"id": 3}), ];
let results = tql
.query(&data, "tags not exists")
.expect("Query should succeed");
assert_eq!(results.len(), 1);
assert_eq!(results[0]["id"], 3);
}
#[test]
fn test_multiple_empty_arrays() {
let tql = Tql::new();
let data = vec![
json!({"id": 1, "tags": []}),
json!({"id": 2, "tags": []}),
json!({"id": 3, "tags": ["python"]}),
];
let results = tql
.query(&data, "any tags eq 'python'")
.expect("Query should succeed");
assert_eq!(results.len(), 1);
assert_eq!(results[0]["id"], 3);
}
#[test]
fn test_empty_array_with_and_expression() {
let tql = Tql::new();
let data = vec![
json!({"id": 1, "tags": []}),
json!({"id": 2, "tags": ["python", "rust"]}),
json!({"id": 3, "tags": ["javascript"]}),
];
let results = tql
.query(&data, "id > 1 AND any tags eq 'python'")
.expect("Query should succeed");
assert_eq!(results.len(), 1);
assert_eq!(results[0]["id"], 2);
}
#[test]
fn test_empty_array_with_or_expression() {
let tql = Tql::new();
let data = vec![
json!({"id": 1, "tags": []}),
json!({"id": 2, "tags": ["python", "rust"]}),
json!({"id": 3, "tags": ["javascript"]}),
];
let results = tql
.query(&data, "any tags eq 'python' OR id = 1")
.expect("Query should succeed");
assert_eq!(results.len(), 2);
let ids: Vec<i64> = results.iter().filter_map(|r| r["id"].as_i64()).collect();
assert!(ids.contains(&1));
assert!(ids.contains(&2));
}
#[test]
fn test_empty_array_field_with_in_operator() {
let tql = Tql::new();
let data = vec![
json!({"id": 1, "tags": []}),
json!({"id": 2, "tags": ["python"]}),
json!({"id": 3, "tags": ["javascript"]}),
];
let results = tql
.query(&data, "any tags eq 'python'")
.expect("Query should succeed");
assert_eq!(results.len(), 1);
assert_eq!(results[0]["id"], 2);
}
#[test]
fn test_empty_array_none_contains() {
let tql = Tql::new();
let data = vec![
json!({"id": 1, "tags": []}),
json!({"id": 2, "tags": ["python", "rust"]}),
json!({"id": 3, "tags": ["javascript"]}),
];
let results = tql
.query(&data, "none tags contains 'python'")
.expect("Query should succeed");
assert_eq!(results.len(), 2);
let ids: Vec<i64> = results.iter().filter_map(|r| r["id"].as_i64()).collect();
assert!(ids.contains(&1));
assert!(ids.contains(&3));
}
#[test]
fn test_empty_array_none_startswith() {
let tql = Tql::new();
let data = vec![
json!({"id": 1, "tags": []}),
json!({"id": 2, "tags": ["python", "rust"]}),
json!({"id": 3, "tags": ["javascript"]}),
];
let results = tql
.query(&data, "none tags startswith 'py'")
.expect("Query should succeed");
assert_eq!(results.len(), 2);
let ids: Vec<i64> = results.iter().filter_map(|r| r["id"].as_i64()).collect();
assert!(ids.contains(&1));
assert!(ids.contains(&3));
}
#[test]
fn test_empty_nested_array() {
let tql = Tql::new();
let data = vec![
json!({"id": 1, "data": {"items": []}}),
json!({"id": 2, "data": {"items": ["a", "b"]}}),
];
let results = tql
.query(&data, "any data.items eq 'a'")
.expect("Query should succeed");
assert_eq!(results.len(), 1);
assert_eq!(results[0]["id"], 2);
}
#[test]
fn test_empty_array_numeric_any_gte_and_lte() {
let tql = Tql::new();
let data = vec![
json!({"id": 1, "values": []}),
json!({"id": 2, "values": [5, 15, 25]}),
json!({"id": 3, "values": [50]}),
];
let results = tql
.query(&data, "any values gte 10 AND any values lte 20")
.expect("Query should succeed");
assert_eq!(results.len(), 1);
assert_eq!(results[0]["id"], 2);
}
#[test]
fn test_empty_array_numeric_any_in_list() {
let tql = Tql::new();
let data = vec![
json!({"id": 1, "values": []}),
json!({"id": 2, "values": [1, 2, 3]}),
json!({"id": 3, "values": [4, 5]}),
];
let results = tql
.query(&data, "any values in [1, 2]")
.expect("Query should succeed");
assert_eq!(results.len(), 1);
assert_eq!(results[0]["id"], 2);
}