use pattern_core::Pattern;
#[test]
fn test_any_value_atomic_pattern_matching() {
let pat = Pattern::point(5);
assert!(pat.any_value(|v| *v > 0));
assert!(!pat.any_value(|v| *v > 10));
}
#[test]
fn test_any_value_atomic_pattern_non_matching() {
let pat = Pattern::point(5);
assert!(!pat.any_value(|v| *v < 0));
assert!(!pat.any_value(|v| *v > 10));
}
#[test]
fn test_any_value_nested_pattern_matches_at_different_levels() {
let pat = Pattern::pattern(
5,
vec![
Pattern::point(10),
Pattern::pattern(3, vec![Pattern::point(15)]),
],
);
assert!(pat.any_value(|v| *v == 5));
assert!(pat.any_value(|v| *v == 10));
assert!(pat.any_value(|v| *v == 15));
assert!(pat.any_value(|v| *v > 12));
}
#[test]
fn test_any_value_no_matching_values() {
let pat = Pattern::pattern(5, vec![Pattern::point(10), Pattern::point(3)]);
assert!(!pat.any_value(|v| *v < 0));
assert!(!pat.any_value(|v| *v > 20));
}
#[test]
fn test_any_value_deeply_nested() {
fn create_deep_pattern(depth: usize, value: i32) -> Pattern<i32> {
if depth == 0 {
Pattern::point(value)
} else {
Pattern::pattern(value, vec![create_deep_pattern(depth - 1, value + 1)])
}
}
let deep_pat = create_deep_pattern(150, 0);
assert!(deep_pat.any_value(|v| *v == 0)); assert!(deep_pat.any_value(|v| *v == 75)); assert!(deep_pat.any_value(|v| *v == 150)); assert!(deep_pat.any_value(|v| *v > 100));
assert!(!deep_pat.any_value(|v| *v < 0));
assert!(!deep_pat.any_value(|v| *v > 150));
}
#[test]
fn test_any_value_large_flat_pattern() {
let elements: Vec<Pattern<i32>> = (0..1000).map(|i| Pattern::point(i)).collect();
let pat = Pattern::pattern(999, elements);
assert!(pat.any_value(|v| *v == 0)); assert!(pat.any_value(|v| *v == 500)); assert!(pat.any_value(|v| *v == 999)); assert!(pat.any_value(|v| *v > 500));
assert!(!pat.any_value(|v| *v < 0));
assert!(!pat.any_value(|v| *v > 1000));
}
#[test]
fn test_any_value_short_circuit_behavior() {
use std::cell::Cell;
let pat = Pattern::pattern(
1,
vec![
Pattern::point(2),
Pattern::point(5), Pattern::point(3),
Pattern::point(4),
],
);
let counter = Cell::new(0);
let result = pat.any_value(|v| {
counter.set(counter.get() + 1);
*v == 5
});
assert!(result);
assert!(
counter.get() <= 3,
"Expected early termination, but evaluated {} values",
counter.get()
);
}