use quarb::{QueryResult, Value};
fn doc() -> quarb_json::JsonAdapter {
quarb_json::JsonAdapter::parse(
r#"{"letters":[
{"id":"a","when":"1887-07-07","notBefore":"1887-01-01","subtitle":"To P. I. Biryukov"},
{"id":"b","when":null,"notBefore":"1844-05-29","subtitle":null},
{"id":"c","when":"","notBefore":"1900","n":0,"ok":false}]}"#,
)
.unwrap()
}
fn run(q: &str) -> quarb::Result<Vec<String>> {
let out = quarb::Query::parse(q, &doc())?.run(&doc(), &quarb::Run::ambient())?;
Ok(match out.result {
QueryResult::Values(vs) => vs.iter().map(Value::display_form).collect(),
QueryResult::Nodes(ns) => ns.iter().map(|n| format!("{n:?}")).collect(),
})
}
#[test]
fn the_null_default_fills_a_null_and_nothing_else() {
assert_eq!(
run("/letters/* | (::when ?? ::notBefore)").unwrap(),
["1887-07-07", "1844-05-29", ""]
);
assert_eq!(
run("/letters/*[::id = \"b\"] | %(year = ::when ?? ::notBefore)").unwrap(),
[r#"%(year = "1844-05-29")"#]
);
assert_eq!(
run("/letters/* | (::subtitle ?? \"-\")").unwrap(),
["To P. I. Biryukov", "-", "-"]
);
assert_eq!(run("/letters/*[::id = \"c\"] | (::n ?? 9)").unwrap(), ["0"]);
assert_eq!(run("/letters/*[::id = \"c\"] | (::ok ?? true)").unwrap(), ["false"]);
assert_eq!(run("/letters/*[::id = \"c\"] | (::when ?? \"x\")").unwrap(), [""]);
assert_eq!(
run("/letters/*[::id = \"b\"] | (::when ?? ::nothing ?? ::notBefore)").unwrap(),
["1844-05-29"]
);
assert_eq!(run("/letters/*[::id = \"c\"] | (::n + 1 ?? 7)").unwrap(), ["1"]);
assert_eq!(run("/letters/*[::id = \"b\"] | (::missing + 1 ?? 7)").unwrap(), ["7"]);
assert_eq!(
run("/letters/*[::id = \"b\"] | (::when ?? ::notBefore ? \"dated\" : \"undated\")").unwrap(),
["dated"]
);
let e = run("/letters/* | (::when??::notBefore)").unwrap_err().to_string();
assert!(e.contains("'??' is an operator and takes a space on both sides"), "{e}");
}