#![allow(non_snake_case)]
use uor_addr::json::{address, AddressFailure, JsonValue, MAX_JSON_DEPTH};
#[test]
fn ct_t01__integer_distinct_from_string_of_same_digits() {
let int_addr = address(b"42").expect("valid").address;
let str_addr = address(br#""42""#).expect("valid").address;
assert_ne!(int_addr, str_addr);
}
#[test]
fn ct_t02__null_distinct_from_false() {
let null_addr = address(b"null").expect("valid").address;
let false_addr = address(b"false").expect("valid").address;
assert_ne!(null_addr, false_addr);
}
#[test]
fn ct_t03__three_scalars_pairwise_distinct() {
let t = address(b"true").expect("valid").address;
let f = address(b"false").expect("valid").address;
let n = address(b"null").expect("valid").address;
assert_ne!(t, f);
assert_ne!(t, n);
assert_ne!(f, n);
}
#[test]
fn ct_t04__empty_object_distinct_from_empty_array() {
let obj = address(b"{}").expect("valid").address;
let arr = address(b"[]").expect("valid").address;
assert_ne!(obj, arr);
}
#[test]
fn ct_t05__number_array_distinct_from_string_array() {
let nums = address(b"[1,2,3]").expect("valid").address;
let strs = address(br#"["1","2","3"]"#).expect("valid").address;
assert_ne!(nums, strs);
}
#[test]
fn ct_e01__key_ordering_invariance() {
let a = address(br#"{"alpha":1,"beta":2,"gamma":3}"#)
.expect("valid")
.address;
let b = address(br#"{"gamma":3,"beta":2,"alpha":1}"#)
.expect("valid")
.address;
assert_eq!(a, b);
}
#[test]
fn ct_e02__whitespace_invariance() {
let a = address(b"{ \"x\" : [ 1 , 2 , 3 ] }")
.expect("valid")
.address;
let b = address(br#"{"x":[1,2,3]}"#).expect("valid").address;
assert_eq!(a, b);
}
#[test]
fn ct_e03__nfc_invariance() {
let composed = address("{\"x\":\"caf\u{00E9}\"}".as_bytes())
.expect("valid")
.address;
let decomposed = address("{\"x\":\"cafe\u{0301}\"}".as_bytes())
.expect("valid")
.address;
assert_eq!(composed, decomposed);
}
#[test]
fn ct_e04__nested_key_ordering_invariance() {
let a = br#"{"z":{"y":{"x":1,"w":2}},"a":1}"#;
let b = br#"{"a":1,"z":{"y":{"w":2,"x":1}}}"#;
let addr_a = address(a).expect("valid").address;
let addr_b = address(b).expect("valid").address;
assert_eq!(addr_a, addr_b);
}
#[test]
fn ct_b01__over_deep_nesting_rejected_at_parse() {
let mut s = String::new();
for _ in 0..(MAX_JSON_DEPTH + 4) {
s.push('[');
}
for _ in 0..(MAX_JSON_DEPTH + 4) {
s.push(']');
}
let err = address(s.as_bytes()).expect_err("must reject");
assert!(matches!(err, AddressFailure::InvalidJson));
}
#[test]
fn ct_b02__wide_string_admitted() {
let big: String = "a".repeat(100_000);
let raw = format!("\"{big}\"");
assert!(address(raw.as_bytes()).is_ok());
}
#[test]
fn ct_b03__exactly_at_depth_bound_accepted() {
let mut s = String::new();
for _ in 0..MAX_JSON_DEPTH {
s.push('[');
}
s.push('1');
for _ in 0..MAX_JSON_DEPTH {
s.push(']');
}
let addr = address(s.as_bytes()).expect("at-bound depth must be accepted");
assert_eq!(addr.address.len(), 71);
}
#[test]
fn ct_b04__invalid_json_rejected_distinct_from_size_bound() {
let err = address(b"not json").expect_err("must reject");
assert!(matches!(err, AddressFailure::InvalidJson));
}
#[test]
fn ct_c01__cost_model_is_empty_commitment() {
let _: uor_addr::EmptyCommitment = Default::default();
}
#[test]
fn ct_p01__parse_returns_tagged_bytes() {
let v = JsonValue::parse(br#"{"k":42}"#).expect("valid");
assert!(!v.tagged_bytes().is_empty());
}
#[test]
fn ct_p02__parse_rejects_invalid_json() {
let err = JsonValue::parse(b"{").expect_err("invalid JSON must fail");
assert!(err.constraint_iri.contains("validUtf8Json"));
}