use logdive_core::{QueryNode, parse_query};
use proptest::prelude::*;
proptest! {
#[test]
fn prop_parse_arbitrary_string_never_panics(s in ".*") {
let _ = parse_query(&s);
}
#[test]
fn prop_valid_equality_parses_to_single_group(
field in "[a-zA-Z_][a-zA-Z0-9_]{0,15}",
value in "[a-zA-Z0-9]{1,20}",
) {
let query = format!("{field}={value}");
if let Ok(ast) = parse_query(&query) {
let QueryNode::Or(groups) = *
prop_assert_eq!(groups.len(), 1, "single equality → one OR group");
prop_assert_eq!(groups[0].clauses.len(), 1, "single equality → one clause");
}
}
#[test]
fn prop_n_or_disjuncts_yields_n_groups(n in 1usize..=10usize) {
let query: String = (0..n)
.map(|i| format!("level=v{i}"))
.collect::<Vec<_>>()
.join(" OR ");
let ast = parse_query(&query).expect("level=vN OR … must always parse");
let QueryNode::Or(groups) = *
prop_assert_eq!(groups.len(), n, "OR disjunct count must equal group count");
}
#[test]
fn prop_quoted_value_with_printable_ascii_never_panics(
value in "[ -~]{0,64}",
) {
let query = format!(r#"message contains "{value}""#);
let _ = parse_query(&query);
}
}