mod common;
use bc_envelope::prelude::*;
use bc_envelope_pattern::{Matcher, Pattern, format_paths};
use dcbor_parse::parse_dcbor_item;
use indoc::indoc;
#[test]
fn test_dcbor_pattern_extended_paths() {
let nested_cbor =
parse_dcbor_item(r#"{"numbers": [1, 2, 3], "nested": {"value": 42}}"#)
.unwrap();
let envelope = Envelope::new(nested_cbor);
let pattern = Pattern::parse("cbor(/search(number)/)").unwrap();
let paths = pattern.paths(&envelope);
assert_eq!(
paths.len(),
4,
"Should find 4 numbers in the nested structure"
);
let actual = format_paths(&paths);
#[rustfmt::skip]
let expected = indoc! {r#"
4bd40828 LEAF {"nested": {"value": 42}, "numbers": [1, 2, 3]}
563fb650 LEAF {"value": 42}
7f83f7bd LEAF 42
4bd40828 LEAF {"nested": {"value": 42}, "numbers": [1, 2, 3]}
4abc3113 LEAF [1, 2, 3]
4bf5122f LEAF 1
4bd40828 LEAF {"nested": {"value": 42}, "numbers": [1, 2, 3]}
4abc3113 LEAF [1, 2, 3]
dbc1b4c9 LEAF 2
4bd40828 LEAF {"nested": {"value": 42}, "numbers": [1, 2, 3]}
4abc3113 LEAF [1, 2, 3]
084fed08 LEAF 3
"#}
.trim();
assert_actual_expected!(
actual,
expected,
"`cbor` pattern should return extended paths for all numbers in nested structure"
);
}
#[test]
fn test_dcbor_pattern_simple_leaf_paths() {
let envelope = Envelope::new(42);
let pattern = Pattern::parse("cbor(/number/)").unwrap();
let paths = pattern.paths(&envelope);
assert_eq!(paths.len(), 1, "Should find 1 number");
let actual = format_paths(&paths);
let expected = "7f83f7bd LEAF 42";
assert_actual_expected!(
actual,
expected,
"Single value `cbor` pattern should return just the root envelope"
);
}
#[test]
fn test_dcbor_pattern_array_paths() {
let array_cbor = parse_dcbor_item("[1, \"hello\", true]").unwrap();
let envelope = Envelope::new(array_cbor);
let pattern = Pattern::parse("cbor(/search(text)/)").unwrap();
let paths = pattern.paths(&envelope);
assert_eq!(paths.len(), 1, "Should find 1 text element");
let actual = format_paths(&paths);
#[rustfmt::skip]
let expected = indoc! {r#"
4cd61f73 LEAF [1, "hello", true]
cb835593 LEAF "hello"
"#}
.trim();
assert_actual_expected!(
actual,
expected,
"Text search should find hello with proper path extension"
);
}
#[test]
fn test_dcbor_pattern_array_elements() {
let array_cbor = parse_dcbor_item("[1, 2, 3]").unwrap();
let envelope = Envelope::new(array_cbor);
let pattern = Pattern::parse("cbor(/search(number)/)").unwrap();
let paths = pattern.paths(&envelope);
assert_eq!(paths.len(), 3, "Should find 3 numbers in the array");
let actual = format_paths(&paths);
#[rustfmt::skip]
let expected = indoc! {r#"
4abc3113 LEAF [1, 2, 3]
4bf5122f LEAF 1
4abc3113 LEAF [1, 2, 3]
dbc1b4c9 LEAF 2
4abc3113 LEAF [1, 2, 3]
084fed08 LEAF 3
"#}
.trim();
assert_actual_expected!(
actual,
expected,
"Array numbers should be found with proper path extension"
);
}
#[test]
fn test_cbor_pattern_multiple_paths() {
let cbor_data = dcbor_parse::parse_dcbor_item(
r#"
{
"numbers": [1, 2, 3],
"value": 42
}
"#,
)
.unwrap();
let envelope = Envelope::new(cbor_data);
let pattern = Pattern::parse("cbor(/search(number)/)").unwrap();
let paths = pattern.paths(&envelope);
assert_eq!(
paths.len(),
4,
"Should find 4 numbers in the `cbor` structure"
);
let actual = format_paths(&paths);
#[rustfmt::skip]
let expected = indoc! {r#"
832e44f1 LEAF {"value": 42, "numbers": [1, 2, 3]}
7f83f7bd LEAF 42
832e44f1 LEAF {"value": 42, "numbers": [1, 2, 3]}
4abc3113 LEAF [1, 2, 3]
4bf5122f LEAF 1
832e44f1 LEAF {"value": 42, "numbers": [1, 2, 3]}
4abc3113 LEAF [1, 2, 3]
dbc1b4c9 LEAF 2
832e44f1 LEAF {"value": 42, "numbers": [1, 2, 3]}
4abc3113 LEAF [1, 2, 3]
084fed08 LEAF 3
"#}
.trim();
assert_actual_expected!(
actual,
expected,
"Complex structure should show proper path extension to all numbers"
);
}
#[test]
fn test_array_element_access() {
let array_data = vec![1, 2, 3];
let envelope = Envelope::new(array_data.clone());
let pattern = Pattern::parse("cbor(/search(number)/)").unwrap();
let paths = pattern.paths(&envelope);
assert_eq!(paths.len(), 3, "Should find 3 numbers in the array");
let actual = format_paths(&paths);
#[rustfmt::skip]
let expected = indoc! {r#"
4abc3113 LEAF [1, 2, 3]
4bf5122f LEAF 1
4abc3113 LEAF [1, 2, 3]
dbc1b4c9 LEAF 2
4abc3113 LEAF [1, 2, 3]
084fed08 LEAF 3
"#}
.trim();
assert_actual_expected!(
actual,
expected,
"Array search should return extended paths to each element"
);
}