use boundary_compiler::{parse_with_dup_check, Canonicalizer, ContentDigest};
use serde_json::json;
#[test]
fn rfc8785_basic_object() {
let c = Canonicalizer::new();
let val = json!({"b": 1, "a": 2});
let canonical = c.canonicalize(&val).unwrap();
assert_eq!(canonical, r#"{"a":2,"b":1}"#);
}
#[test]
fn rfc8785_nested() {
let c = Canonicalizer::new();
let val = json!({
"z": {"b": 1, "a": 2},
"m": [3, 2, 1],
"a": "hello"
});
let canonical = c.canonicalize(&val).unwrap();
assert_eq!(canonical, r#"{"a":"hello","m":[3,2,1],"z":{"a":2,"b":1}}"#);
}
#[test]
fn rfc8785_arrays_preserve_order() {
let c = Canonicalizer::new();
let val = json!([3, 1, 2]);
let canonical = c.canonicalize(&val).unwrap();
assert_eq!(canonical, r#"[3,1,2]"#);
}
#[test]
fn rfc8785_number_formatting() {
let c = Canonicalizer::new();
assert_eq!(c.canonicalize(&json!(42)).unwrap(), "42");
assert_eq!(c.canonicalize(&json!(-1)).unwrap(), "-1");
assert_eq!(c.canonicalize(&json!(0.5)).unwrap(), "0.5");
let scientific = json!(1e10);
let result = c.canonicalize(&scientific).unwrap();
assert!(result.contains("1e") || result.contains("10"));
}
#[test]
fn duplicate_key_rejection() {
let result = parse_with_dup_check(r#"{"a": 1, "a": 2}"#);
assert!(result.is_err());
let err = result.unwrap_err();
assert!(err.to_string().contains("duplicate") || err.to_string().contains("DuplicateKey"));
}
#[test]
fn duplicate_key_nested_rejection() {
let result = parse_with_dup_check(r#"{"outer": {"x": 1, "x": 2}}"#);
assert!(result.is_err());
}
#[test]
fn content_digest_computation() {
let val = json!({"b": 2, "a": 1});
let digest = ContentDigest::compute(&val).unwrap();
let hex = digest.hex();
assert!(!hex.is_empty());
let digest2 = ContentDigest::compute(&val).unwrap();
assert_eq!(digest.hex(), digest2.hex());
}
#[test]
fn parse_and_validate_accepts_valid() {
let input = r#"{"z": 1, "a": 2, "m": 3}"#;
let val = boundary_compiler::parse_and_validate(input).unwrap();
let c = Canonicalizer::new();
let canonical = c.canonicalize(&val).unwrap();
assert_eq!(canonical, r#"{"a":2,"m":3,"z":1}"#);
}