use bc_ur::prelude::*;
use dcbor_parse::parse_dcbor_item;
#[test]
fn test_basic_functionality_preserved() {
let result = parse_dcbor_item(r#""Hello, World!""#).unwrap();
assert_eq!(result, "Hello, World!".into());
let result = parse_dcbor_item(r#""""#).unwrap();
assert_eq!(result, "".into());
let result = parse_dcbor_item("h'deadbeef'").unwrap();
assert_eq!(
result,
dcbor::CBOR::to_byte_string(vec![0xDE, 0xAD, 0xBE, 0xEF])
);
let result = parse_dcbor_item("h''").unwrap();
assert_eq!(result, dcbor::CBOR::to_byte_string(vec![]));
let result = parse_dcbor_item("b64'SGVsbG8='").unwrap();
assert_eq!(result, dcbor::CBOR::to_byte_string(b"Hello"));
dcbor::register_tags();
let result = parse_dcbor_item("2023-12-25").unwrap();
let expected = Date::from_ymd(2023, 12, 25);
assert_eq!(result, expected.to_cbor());
let result = parse_dcbor_item(r#"["hello", h'dead', 42]"#).unwrap();
let array = result.as_array().expect("Should be an array");
assert_eq!(array.len(), 3);
assert_eq!(array[0], "hello".into());
assert_eq!(array[1], dcbor::CBOR::to_byte_string(vec![0xDE, 0xAD]));
assert_eq!(array[2], 42.into());
let result =
parse_dcbor_item(r#"{"key": "value", "number": 123}"#).unwrap();
let map = result.as_map().expect("Should be a map");
assert!(map.contains_key("key"));
assert!(map.contains_key("number"));
}
#[test]
fn test_simplified_patterns_compilation() {
let inputs = vec![
r#""simple""#,
"h'ff'",
"b64'QUE='",
"2023-01-01",
"42",
"true",
"false",
"null",
"[1, 2, 3]",
r#"{"a": 1}"#,
];
for input in inputs {
let result = parse_dcbor_item(input);
assert!(result.is_ok(), "Failed to parse: {}", input);
}
}
#[test]
fn test_hex_parsing_comprehensive() {
let result = parse_dcbor_item("h''").unwrap();
assert_eq!(result, dcbor::CBOR::to_byte_string(vec![]));
let result = parse_dcbor_item("h'FF'").unwrap();
assert_eq!(result, dcbor::CBOR::to_byte_string(vec![0xFF]));
let result = parse_dcbor_item("h'deadbeef'").unwrap();
assert_eq!(
result,
dcbor::CBOR::to_byte_string(vec![0xDE, 0xAD, 0xBE, 0xEF])
);
let result = parse_dcbor_item("h'DEADBEEF'").unwrap();
assert_eq!(
result,
dcbor::CBOR::to_byte_string(vec![0xDE, 0xAD, 0xBE, 0xEF])
);
let result = parse_dcbor_item("h'DeAdBeEf'").unwrap();
assert_eq!(
result,
dcbor::CBOR::to_byte_string(vec![0xDE, 0xAD, 0xBE, 0xEF])
);
}
#[test]
fn test_ide_compatibility() {
assert!(parse_dcbor_item("true").is_ok());
assert!(parse_dcbor_item("false").is_ok());
assert!(parse_dcbor_item("null").is_ok());
assert!(parse_dcbor_item("42").is_ok());
assert!(parse_dcbor_item("3.14").is_ok());
assert!(parse_dcbor_item(r#""string""#).is_ok());
assert!(parse_dcbor_item("h'dead'").is_ok());
assert!(parse_dcbor_item("b64'SGVsbG8='").is_ok());
dcbor::register_tags();
assert!(parse_dcbor_item("2023-01-01").is_ok());
assert!(parse_dcbor_item("[1, 2, 3]").is_ok());
assert!(parse_dcbor_item(r#"{"key": "value"}"#).is_ok());
assert!(parse_dcbor_item("42(123)").is_ok()); }
#[test]
fn test_complex_string_escapes_runtime_only() {
let result = parse_dcbor_item(r#""She said \"Hello\"""#).unwrap();
assert_eq!(result, r#"She said \"Hello\""#.into());
let result = parse_dcbor_item(r#""Path\\to\\file""#).unwrap();
assert_eq!(result, r#"Path\\to\\file"#.into());
let result = parse_dcbor_item(r#""Line 1\nLine 2\tTabbed""#).unwrap();
assert_eq!(result, r#"Line 1\nLine 2\tTabbed"#.into());
let result = parse_dcbor_item(r#""Unicode: \u0041\u0042\u0043""#).unwrap();
assert_eq!(result, r#"Unicode: \u0041\u0042\u0043"#.into());
let result = parse_dcbor_item(r#""Valid escape: \"""#).unwrap();
assert_eq!(result, r#"Valid escape: \""#.into());
let result = parse_dcbor_item(r#""Valid unicode: \u1234""#).unwrap();
assert_eq!(result, r#"Valid unicode: \u1234"#.into());
}
#[test]
fn test_complex_date_formats_runtime_only() {
dcbor::register_tags();
let result = parse_dcbor_item("2023-12-25T10:30:45Z").unwrap();
let expected = Date::from_string("2023-12-25T10:30:45Z").unwrap();
assert_eq!(result, expected.to_cbor());
let result = parse_dcbor_item("2023-12-25T10:30:45+05:30").unwrap();
let expected = Date::from_string("2023-12-25T10:30:45+05:30").unwrap();
assert_eq!(result, expected.to_cbor());
let result = parse_dcbor_item("2023-12-25T10:30:45-08:00").unwrap();
let expected = Date::from_string("2023-12-25T10:30:45-08:00").unwrap();
assert_eq!(result, expected.to_cbor());
let result = parse_dcbor_item("2023-12-25T10:30:45.123Z").unwrap();
let expected = Date::from_string("2023-12-25T10:30:45.123Z").unwrap();
assert_eq!(result, expected.to_cbor());
let result = parse_dcbor_item("2023-12-25T10:30:45.123456Z").unwrap();
let expected = Date::from_string("2023-12-25T10:30:45.123456Z").unwrap();
assert_eq!(result, expected.to_cbor());
}
#[test]
fn test_complex_base64_requirements_runtime_only() {
let result = parse_dcbor_item("b64'QQ=='").unwrap();
assert_eq!(result, dcbor::CBOR::to_byte_string(vec![0x41]));
let result = parse_dcbor_item("b64'SGVsbG8gV29ybGQ='").unwrap();
assert_eq!(result, dcbor::CBOR::to_byte_string(b"Hello World"));
let result = parse_dcbor_item("b64'SGVsbG8='").unwrap();
assert_eq!(result, dcbor::CBOR::to_byte_string(b"Hello"));
}
#[test]
fn test_complex_mixed_patterns_runtime_only() {
dcbor::register_tags();
let complex_array = r#"[
"String with \"quotes\" and \\n newlines",
h'deadbeef',
b64'SGVsbG8gV29ybGQ=',
2023-12-25T10:30:45.123Z,
"Unicode: \\u0041\\u0042\\u0043"
]"#;
let result = parse_dcbor_item(complex_array).unwrap();
let array = result.as_array().expect("Should be an array");
assert_eq!(array.len(), 5);
assert_eq!(
array[0],
r#"String with \"quotes\" and \\n newlines"#.into()
);
assert_eq!(
array[1],
dcbor::CBOR::to_byte_string(vec![0xDE, 0xAD, 0xBE, 0xEF])
);
assert_eq!(array[2], dcbor::CBOR::to_byte_string(b"Hello World"));
let expected_date = Date::from_string("2023-12-25T10:30:45.123Z").unwrap();
assert_eq!(array[3], expected_date.to_cbor());
assert_eq!(array[4], r#"Unicode: \\u0041\\u0042\\u0043"#.into());
let complex_map = r#"{
"message": "Hello \\\"World\\\" with \\n newlines",
"data": h'0123456789abcdef',
"timestamp": 2023-12-25T10:30:45-08:00
}"#;
let result = parse_dcbor_item(complex_map).unwrap();
let map = result.as_map().expect("Should be a map");
assert!(map.contains_key("message"));
assert!(map.contains_key("timestamp"));
assert!(map.len() >= 2);
}
#[test]
fn test_base64_minimum_length_enforcement() {
let input = r#"b64'A'"#;
let result = parse_dcbor_item(input);
let empty_input = r#"b64''"#;
let empty_result = parse_dcbor_item(empty_input);
assert!(empty_result.is_err());
assert!(result.is_err());
}
#[test]
fn test_date_with_fractional_seconds() {
let input = r#"2023-12-25T12:30:45.123Z"#;
dcbor::register_tags();
let result = parse_dcbor_item(input);
assert!(result.is_ok());
}
#[test]
fn test_date_with_timezone_offset() {
let input = r#"2023-12-25T12:30:45+05:30"#;
dcbor::register_tags();
let result = parse_dcbor_item(input);
assert!(result.is_ok());
}
#[test]
fn test_string_with_control_characters_rejected() {
let input = "\"hello\x01world\""; let result = parse_dcbor_item(input);
assert!(result.is_err());
}
#[test]
fn test_string_with_unescaped_quotes_rejected() {
let input = r#""hello"world""#; let result = parse_dcbor_item(input);
assert!(result.is_err());
}
#[test]
fn test_complex_string_escapes() {
let input = r#""hello\nworld\t\u0041""#;
let result = parse_dcbor_item(input);
assert!(result.is_ok());
let parsed = result.unwrap();
let s = parsed.as_text().expect("Should be a string");
assert!(s.contains("\\n")); assert!(s.contains("\\u0041")); }
#[test]
fn test_runtime_pattern_validation() {
dcbor::register_tags();
let complex_date = "2023-12-25T10:30:45.123456Z";
let result = parse_dcbor_item(complex_date);
assert!(
result.is_ok(),
"Complex date should parse with full patterns"
);
let escaped_string = r#""line1\nline2\ttab\u0041end""#;
let result = parse_dcbor_item(escaped_string);
assert!(
result.is_ok(),
"Escaped string should parse with full patterns"
);
let base64_input = "b64'SGVsbG8gV29ybGQ='"; let result = parse_dcbor_item(base64_input);
assert!(
result.is_ok(),
"Proper base64 should parse with full patterns"
);
let complex_input = r#"{
"message": "Hello\nWorld",
"data": b64'SGVsbG8=',
"timestamp": 2023-12-25T10:30:45.123Z,
"binary": h'deadbeef'
}"#;
let result = parse_dcbor_item(complex_input);
assert!(
result.is_ok(),
"Complex mixed input should parse with full patterns"
);
}