use pattern_core::Pattern;
#[test]
fn traverse_option_atomic_some() {
let pattern = Pattern::point("42");
let result = pattern.traverse_option(|s| s.parse::<i32>().ok());
assert!(result.is_some());
let new_pattern = result.unwrap();
assert_eq!(new_pattern.value, 42);
assert_eq!(new_pattern.elements.len(), 0);
}
#[test]
fn traverse_option_atomic_none() {
let pattern = Pattern::point("invalid");
let result = pattern.traverse_option(|s| s.parse::<i32>().ok());
assert!(result.is_none());
}
#[test]
fn traverse_option_nested_all_some() {
let pattern = Pattern::pattern("1", vec![Pattern::point("2"), Pattern::point("3")]);
let result = pattern.traverse_option(|s| s.parse::<i32>().ok());
assert!(result.is_some());
let new_pattern = result.unwrap();
assert_eq!(new_pattern.value, 1);
assert_eq!(new_pattern.elements.len(), 2);
assert_eq!(new_pattern.elements[0].value, 2);
assert_eq!(new_pattern.elements[1].value, 3);
}
#[test]
fn traverse_option_nested_with_none() {
let pattern = Pattern::pattern(
"1",
vec![
Pattern::point("2"),
Pattern::point("invalid"), Pattern::point("3"),
],
);
let result = pattern.traverse_option(|s| s.parse::<i32>().ok());
assert!(result.is_none());
}
#[test]
fn sequence_option_all_some() {
let pattern = Pattern::pattern(
Some(1),
vec![Pattern::point(Some(2)), Pattern::point(Some(3))],
);
let result = pattern.sequence_option();
assert!(result.is_some());
let unwrapped = result.unwrap();
assert_eq!(unwrapped.value, 1);
assert_eq!(unwrapped.elements[0].value, 2);
assert_eq!(unwrapped.elements[1].value, 3);
}
#[test]
fn sequence_option_with_none() {
let pattern = Pattern::pattern(
Some(1),
vec![
Pattern::point(Some(2)),
Pattern::point(None), Pattern::point(Some(3)),
],
);
let result = pattern.sequence_option();
assert!(result.is_none());
}
#[test]
fn sequence_option_nested_structure() {
let pattern = Pattern::pattern(
Some(1),
vec![Pattern::pattern(
Some(2),
vec![Pattern::point(Some(3)), Pattern::point(Some(4))],
)],
);
let result = pattern.sequence_option();
assert!(result.is_some());
let unwrapped = result.unwrap();
assert_eq!(unwrapped.value, 1);
assert_eq!(unwrapped.elements[0].value, 2);
assert_eq!(unwrapped.elements[0].elements[0].value, 3);
assert_eq!(unwrapped.elements[0].elements[1].value, 4);
}
#[test]
fn sequence_option_none_in_root() {
let pattern = Pattern::pattern(
None, vec![Pattern::point(Some(2)), Pattern::point(Some(3))],
);
let result = pattern.sequence_option();
assert!(result.is_none());
}
#[test]
fn sequence_option_atomic_some() {
let pattern = Pattern::point(Some(42));
let result = pattern.sequence_option();
assert!(result.is_some());
assert_eq!(result.unwrap().value, 42);
}
#[test]
fn sequence_option_atomic_none() {
let pattern: Pattern<Option<i32>> = Pattern::point(None);
let result = pattern.sequence_option();
assert!(result.is_none());
}