weavatrix-refactor-plan 0.1.0

Evidence metadata, validation profiles, and canonical fingerprints for Weavatrix refactor plans
Documentation
use super::{CanonicalSerializer, compare_utf16_order};
use std::cmp::Ordering;

fn canonical<T: serde::Serialize>(value: &T) -> String {
    let mut bytes = Vec::new();
    CanonicalSerializer::new(&mut bytes)
        .write_value(value)
        .expect("canonical serialization succeeds");
    String::from_utf8(bytes).expect("canonical output is UTF-8")
}

#[test]
fn matches_previous_jcs_number_and_escape_output() {
    let value = blazingly_json::json!({
        "integers": [0, 1, -1, 42, 9_007_199_254_740_991_u64, -9_007_199_254_740_991_i64],
        "floats": [1.25, 0.000_001, 0.000_000_125, 1e21, 1e-7],
        "text": "quote\" slash/ backslash\\ control\u{f} tab\t",
    });
    assert_eq!(
        canonical(&value),
        "{\"floats\":[1.25,0.000001,1.25e-7,1e+21,1e-7],\
         \"integers\":[0,1,-1,42,9007199254740991,-9007199254740991],\
         \"text\":\"quote\\\" slash/ backslash\\\\ control\\u000f tab\\t\"}"
    );
}

#[test]
fn sorts_members_by_utf16_code_units_at_every_depth() {
    let value = blazingly_json::json!({
        "\u{e000}": "private-use",
        "😀": {"b": 1, "a": [{"z": 1, "य": 2}]},
        "a": true,
    });
    assert_eq!(
        canonical(&value),
        "{\"a\":true,\"😀\":{\"a\":[{\"z\":1,\"य\":2}],\"b\":1},\"\u{e000}\":\"private-use\"}"
    );
    assert_eq!(compare_utf16_order("😀", "\u{e000}"), Ordering::Less);
    assert_eq!(compare_utf16_order("abc", "abd"), Ordering::Less);
    assert_eq!(compare_utf16_order("ab", "abc"), Ordering::Less);
    assert_eq!(compare_utf16_order("é", "é"), Ordering::Equal);
}

#[test]
fn streams_arrays_and_buffers_only_objects() {
    let value = blazingly_json::json!([
        [],
        {},
        {"nested": {"deep": [null, true, false]}},
        "tail"
    ]);
    assert_eq!(
        canonical(&value),
        "[[],{},{\"nested\":{\"deep\":[null,true,false]}},\"tail\"]"
    );
}

#[test]
fn rejects_non_finite_numbers() {
    let mut bytes = Vec::new();
    let result = CanonicalSerializer::new(&mut bytes).write_value(&f64::NAN);
    assert!(result.is_err());
}