use noyalib::Value;
use noyalib::cst::parse_document;
use proptest::prelude::*;
proptest! {
#![proptest_config(ProptestConfig::with_cases(2048))]
#[test]
fn set_value_round_trips_arbitrary_scalars(s in ".{0,120}") {
let mut doc = parse_document("a: 1\nb: 2\n").expect("parse");
doc.set_value("a", &Value::String(s.clone())).expect("set_value");
let back: Value = noyalib::from_str(doc.source())
.unwrap_or_else(|e| panic!("re-parse failed for {s:?}: {e}"));
let Value::Mapping(m) = &back else {
panic!("expected a mapping for {s:?}")
};
prop_assert_eq!(
m.get("a"),
Some(&Value::String(s.clone())),
"set_value did not round-trip {:?}", s
);
prop_assert_eq!(m.len(), 2, "entry count changed writing {:?}", s);
prop_assert!(m.get("b").is_some(), "sibling lost writing {:?}", s);
}
#[test]
fn set_value_round_trips_when_nested(s in ".{0,80}") {
let mut doc = parse_document("outer:\n a: 1\nz: 9\n").expect("parse");
doc.set_value("outer.a", &Value::String(s.clone())).expect("set_value");
let back: Value = noyalib::from_str(doc.source())
.unwrap_or_else(|e| panic!("re-parse failed for {s:?}: {e}"));
let Value::Mapping(m) = &back else { panic!("expected mapping") };
let Some(Value::Mapping(inner)) = m.get("outer") else {
panic!("outer vanished writing {s:?}")
};
prop_assert_eq!(inner.get("a"), Some(&Value::String(s.clone())));
prop_assert!(m.get("z").is_some(), "sibling lost writing {:?}", s);
prop_assert_eq!(m.len(), 2);
}
#[test]
fn set_never_silently_corrupts(s in ".{0,60}") {
let src = "a: 1\nb: 2\n";
let mut doc = parse_document(src).expect("parse");
let before = doc.source().to_owned();
if doc.set("a", &s).is_err() {
prop_assert_eq!(doc.source(), before, "a refused set must not edit");
} else if let Ok(Value::Mapping(m)) = noyalib::from_str::<Value>(doc.source()) {
prop_assert!(m.get("b").is_some(), "sibling lost splicing {:?}", s);
prop_assert_eq!(m.len(), 2, "entry count changed splicing {:?}", s);
}
}
}