use pattern_core::Pattern;
#[test]
fn test_length_atomic_pattern() {
let pat = Pattern::point(42);
assert_eq!(pat.length(), 0);
}
#[test]
fn test_length_one_element() {
let pat = Pattern::pattern(5, vec![Pattern::point(10)]);
assert_eq!(pat.length(), 1);
}
#[test]
fn test_length_two_elements() {
let pat = Pattern::pattern(5, vec![Pattern::point(10), Pattern::point(3)]);
assert_eq!(pat.length(), 2);
}
#[test]
fn test_length_many_elements() {
let elements: Vec<Pattern<i32>> = (0..10).map(Pattern::point).collect();
let pat = Pattern::pattern(99, elements);
assert_eq!(pat.length(), 10);
}
#[test]
fn test_length_only_counts_direct_elements() {
let pat = Pattern::pattern(
1,
vec![
Pattern::point(2),
Pattern::pattern(3, vec![Pattern::point(4), Pattern::point(5)]),
],
);
assert_eq!(pat.length(), 2); }
#[test]
fn test_size_atomic_pattern() {
let pat = Pattern::point(42);
assert_eq!(pat.size(), 1);
}
#[test]
fn test_size_flat_pattern() {
let pat = Pattern::pattern(5, vec![Pattern::point(10), Pattern::point(3)]);
assert_eq!(pat.size(), 3); }
#[test]
fn test_size_deeply_nested() {
fn create_deep_pattern(depth: usize) -> Pattern<i32> {
if depth == 0 {
Pattern::point(0)
} else {
Pattern::pattern(depth as i32, vec![create_deep_pattern(depth - 1)])
}
}
let deep_pat = create_deep_pattern(100);
assert_eq!(deep_pat.size(), 101); }
#[test]
fn test_size_varying_branch_depths() {
let pat = Pattern::pattern(
1,
vec![
Pattern::point(2),
Pattern::pattern(3, vec![Pattern::point(4)]),
Pattern::pattern(
5,
vec![Pattern::pattern(
6,
vec![Pattern::point(7), Pattern::point(8)],
)],
),
],
);
assert_eq!(pat.size(), 8);
}
#[test]
fn test_depth_atomic_pattern() {
let pat = Pattern::point(42);
assert_eq!(pat.depth(), 0);
}
#[test]
fn test_depth_one_level_nesting() {
let pat = Pattern::pattern(5, vec![Pattern::point(10)]);
assert_eq!(pat.depth(), 1);
}
#[test]
fn test_depth_deeply_nested() {
fn create_deep_pattern(depth: usize) -> Pattern<i32> {
if depth == 0 {
Pattern::point(0)
} else {
Pattern::pattern(depth as i32, vec![create_deep_pattern(depth - 1)])
}
}
let deep_pat = create_deep_pattern(100);
assert_eq!(deep_pat.depth(), 100);
}
#[test]
fn test_depth_different_branch_depths() {
let pat = Pattern::pattern(
1,
vec![
Pattern::point(2), Pattern::pattern(3, vec![Pattern::point(4)]), Pattern::pattern(
5,
vec![Pattern::pattern(6, vec![Pattern::point(7)])], ),
],
);
assert_eq!(pat.depth(), 3); }
#[test]
fn test_values_atomic_pattern() {
let pat = Pattern::point(42);
let vals = pat.values();
assert_eq!(vals.len(), 1);
assert_eq!(*vals[0], 42);
}
#[test]
fn test_values_nested_pattern_pre_order() {
let pat = Pattern::pattern(
1,
vec![
Pattern::point(2),
Pattern::pattern(3, vec![Pattern::point(4)]),
Pattern::point(5),
],
);
let vals = pat.values();
assert_eq!(vals.len(), 5);
assert_eq!(*vals[0], 1);
assert_eq!(*vals[1], 2);
assert_eq!(*vals[2], 3);
assert_eq!(*vals[3], 4);
assert_eq!(*vals[4], 5);
}
#[test]
fn test_values_order_consistency() {
let pat = Pattern::pattern(
"root",
vec![
Pattern::pattern("branch1", vec![Pattern::point("leaf1")]),
Pattern::pattern("branch2", vec![Pattern::point("leaf2")]),
],
);
let vals = pat.values();
assert_eq!(*vals[0], "root");
assert_eq!(*vals[1], "branch1");
assert_eq!(*vals[2], "leaf1");
assert_eq!(*vals[3], "branch2");
assert_eq!(*vals[4], "leaf2");
}
#[test]
fn test_values_with_duplicates() {
let pat = Pattern::pattern(
5,
vec![
Pattern::point(5),
Pattern::pattern(5, vec![Pattern::point(5)]),
],
);
let vals = pat.values();
assert_eq!(vals.len(), 4);
assert!(vals.iter().all(|v| **v == 5));
}
#[test]
fn test_size_equals_values_length() {
let pat = Pattern::pattern(
1,
vec![
Pattern::point(2),
Pattern::pattern(3, vec![Pattern::point(4), Pattern::point(5)]),
],
);
assert_eq!(pat.size(), pat.values().len());
}
#[test]
fn test_length_vs_size_relationship() {
let pat = Pattern::pattern(1, vec![Pattern::point(2), Pattern::point(3)]);
assert!(pat.size() >= pat.length() + 1);
}
#[test]
fn test_depth_zero_means_atomic() {
let atomic = Pattern::point(42);
let non_atomic = Pattern::pattern(5, vec![Pattern::point(10)]);
assert_eq!(atomic.depth(), 0);
assert!(atomic.is_atomic());
assert!(non_atomic.depth() > 0);
assert!(!non_atomic.is_atomic());
}
#[test]
fn test_large_pattern_operations() {
let elements: Vec<Pattern<i32>> = (0..1000).map(Pattern::point).collect();
let pat = Pattern::pattern(999, elements);
assert_eq!(pat.length(), 1000);
assert_eq!(pat.size(), 1001); assert_eq!(pat.depth(), 1);
assert_eq!(pat.values().len(), 1001);
}
#[test]
fn test_empty_pattern_elements() {
let pat = Pattern::pattern(42, vec![]);
assert_eq!(pat.length(), 0);
assert_eq!(pat.size(), 1); assert_eq!(pat.depth(), 0); assert_eq!(pat.values().len(), 1);
assert_eq!(*pat.values()[0], 42);
}