use jsonette::{format, minify, parse};
use proptest::prelude::*;
fn arb_json() -> impl Strategy<Value = String> {
let leaf = prop_oneof![
Just("null".to_string()),
any::<bool>().prop_map(|b| b.to_string()),
any::<i32>().prop_map(|n| n.to_string()),
"[0-9a-zA-Z]{1,10}".prop_map(|s| format!("\"{}\"", s)),
];
leaf.prop_recursive(
8, 256, 10, |inner| {
prop_oneof![
prop::collection::vec(inner.clone(), 0..5)
.prop_map(|elements| format!("[{}]", elements.join(","))),
prop::collection::vec(("[a-z]{1,5}", inner), 0..5).prop_map(|pairs| {
let kvs: Vec<String> = pairs
.into_iter()
.map(|(k, v)| format!("\"{}\":{}", k, v))
.collect();
format!("{{{}}}", kvs.join(","))
})
]
},
)
}
proptest! {
#![proptest_config(ProptestConfig::with_cases(50))]
#[test]
fn test_formatter_idempotence(input in arb_json()) {
let parsed = parse(&input).expect("Generated JSON must be valid");
let formatted_1 = format(&parsed);
let parsed_1 = parse(&formatted_1).expect("Formatted JSON must be valid");
let formatted_2 = format(&parsed_1);
assert_eq!(formatted_1, formatted_2);
}
#[test]
fn test_minify_parsability(input in arb_json()) {
let parsed = parse(&input).expect("Generated JSON must be valid");
let minified = minify(&parsed);
let parsed_minified = parse(&minified).expect("Minified JSON must be parseable");
assert_eq!(minify(&parsed_minified), minified);
}
}