use oxml_wasm::core;
fn main() {
const DOCUMENT: &str = r#"<?xml version="1.0"?>
<catalogue xmlns:m="urn:example:media">
<book><title>Dune</title><year>1965</year></book>
<book><title>Solaris</title><year>1961</year></book>
<m:disc><title>Blade Runner</title></m:disc>
</catalogue>"#;
assert!(core::is_well_formed(DOCUMENT), "the sample parses");
assert!(
!core::is_well_formed("<a><b></a>"),
"mismatched tags are not well-formed"
);
let doc = core::parse(DOCUMENT).expect("the sample is well-formed");
println!("root: {:?}", core::root_name(&doc));
assert_eq!(core::root_name(&doc).as_deref(), Some("catalogue"));
let titles =
core::query_text(&doc, "//book/title", &[]).expect("valid expression");
println!("titles: {titles:?}");
assert_eq!(titles, ["Dune", "Solaris"]);
let count =
core::query_count(&doc, "//book", &[]).expect("valid expression");
println!("books: {count}");
assert_eq!(count, 2);
let earliest = core::query_value(&doc, "string(//book[2]/year)", &[])
.expect("valid expression");
println!("second book's year: {earliest}");
assert_eq!(earliest, "1961");
let bindings = vec!["m=urn:example:media".to_owned()];
let discs = core::query_text(&doc, "//m:disc/title", &bindings)
.expect("valid expression");
println!("discs: {discs:?}");
assert_eq!(discs, ["Blade Runner"]);
let unbound = core::query_text(&doc, "//m:disc", &[]);
println!("unbound prefix: {unbound:?}");
assert!(unbound.is_err(), "an unbound prefix must be reported");
let xml = core::to_xml(&doc);
println!("serialised {} bytes", xml.len());
let again = core::parse(&xml).expect("the serialised document parses");
assert_eq!(
core::to_xml(&again),
xml,
"serialisation must be a fixed point"
);
let tricky = core::parse(r#"<a note="x < y">p & q</a>"#)
.expect("well-formed");
let out = core::to_xml(&tricky);
println!("escaped: {out}");
assert!(out.contains("&"), "text `&` must stay escaped: {out}");
assert!(
out.contains("<"),
"attribute `<` must stay escaped: {out}"
);
assert_eq!(
core::query_value(
&core::parse(&out).expect("reparses"),
"string(//a)",
&[]
)
.expect("valid expression"),
"p & q",
"the text must survive the round trip unchanged"
);
}