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());
}