use pretty_assertions::assert_eq;
use quick_xml::events::attributes::Attribute;
use quick_xml::events::Event::*;
use quick_xml::name::ResolveResult::*;
use quick_xml::name::{Namespace, QName};
use quick_xml::reader::NsReader;
use std::borrow::Cow;
#[test]
fn namespace() {
let mut r = NsReader::from_str("<a xmlns:myns='www1'><myns:b>in namespace!</myns:b></a>");
r.trim_text(true);
match r.read_resolved_event() {
Ok((ns, Start(_))) => assert_eq!(ns, Unbound),
e => panic!(
"expecting outer start element with no namespace, got {:?}",
e
),
}
match r.read_resolved_event() {
Ok((ns, Start(_))) => assert_eq!(ns, Bound(Namespace(b"www1"))),
e => panic!(
"expecting inner start element with to resolve to 'www1', got {:?}",
e
),
}
match r.read_resolved_event() {
Ok((ns, Text(_))) => assert_eq!(ns, Unbound),
e => panic!("expecting text content with no namespace, got {:?}", e),
}
match r.read_resolved_event() {
Ok((ns, End(_))) => assert_eq!(ns, Bound(Namespace(b"www1"))),
e => panic!(
"expecting inner end element with to resolve to 'www1', got {:?}",
e
),
}
match r.read_resolved_event() {
Ok((ns, End(_))) => assert_eq!(ns, Unbound),
e => panic!("expecting outer end element with no namespace, got {:?}", e),
}
}
#[test]
fn default_namespace() {
let mut r = NsReader::from_str(r#"<a ><b xmlns="www1"></b></a>"#);
r.trim_text(true);
match r.read_resolved_event() {
Ok((ns, Start(_))) => assert_eq!(ns, Unbound),
e => panic!(
"expecting outer start element with no namespace, got {:?}",
e
),
}
match r.read_resolved_event() {
Ok((ns, Start(_))) => assert_eq!(ns, Bound(Namespace(b"www1"))),
e => panic!(
"expecting inner start element with to resolve to 'www1', got {:?}",
e
),
}
match r.read_resolved_event() {
Ok((ns, End(_))) => assert_eq!(ns, Bound(Namespace(b"www1"))),
e => panic!(
"expecting inner end element with to resolve to 'www1', got {:?}",
e
),
}
match r.read_resolved_event() {
Ok((ns, End(_))) => assert_eq!(ns, Unbound),
e => panic!("expecting outer end element with no namespace, got {:?}", e),
}
}
#[test]
fn default_namespace_reset() {
let mut r = NsReader::from_str(r#"<a xmlns="www1"><b xmlns=""></b></a>"#);
r.trim_text(true);
match r.read_resolved_event() {
Ok((ns, Start(_))) => assert_eq!(ns, Bound(Namespace(b"www1"))),
e => panic!(
"expecting outer start element with to resolve to 'www1', got {:?}",
e
),
}
match r.read_resolved_event() {
Ok((ns, Start(_))) => assert_eq!(ns, Unbound),
e => panic!(
"expecting inner start element with no namespace, got {:?}",
e
),
}
match r.read_resolved_event() {
Ok((ns, End(_))) => assert_eq!(ns, Unbound),
e => panic!("expecting inner end element with no namespace, got {:?}", e),
}
match r.read_resolved_event() {
Ok((ns, End(_))) => assert_eq!(ns, Bound(Namespace(b"www1"))),
e => panic!(
"expecting outer end element with to resolve to 'www1', got {:?}",
e
),
}
}
#[test]
fn attributes_empty_ns() {
let src = "<a att1='a' r:att2='b' xmlns:r='urn:example:r' />";
let mut r = NsReader::from_str(src);
r.trim_text(true).expand_empty_elements(false);
let e = match r.read_resolved_event() {
Ok((Unbound, Empty(e))) => e,
e => panic!("Expecting Empty event, got {:?}", e),
};
let mut attrs = e
.attributes()
.map(|ar| ar.expect("Expecting attribute parsing to succeed."))
.filter(|kv| kv.key.as_namespace_binding().is_none())
.map(|Attribute { key: name, value }| {
let (opt_ns, local_name) = r.resolve_attribute(name);
(opt_ns, local_name.into_inner(), value)
});
assert_eq!(
attrs.next(),
Some((Unbound, &b"att1"[..], Cow::Borrowed(&b"a"[..])))
);
assert_eq!(
attrs.next(),
Some((
Bound(Namespace(b"urn:example:r")),
&b"att2"[..],
Cow::Borrowed(&b"b"[..])
))
);
assert_eq!(attrs.next(), None);
}
#[test]
fn attributes_empty_ns_expanded() {
let src = "<a att1='a' r:att2='b' xmlns:r='urn:example:r' />";
let mut r = NsReader::from_str(src);
r.trim_text(true).expand_empty_elements(true);
{
let e = match r.read_resolved_event() {
Ok((Unbound, Start(e))) => e,
e => panic!("Expecting Empty event, got {:?}", e),
};
let mut attrs = e
.attributes()
.map(|ar| ar.expect("Expecting attribute parsing to succeed."))
.filter(|kv| kv.key.as_namespace_binding().is_none())
.map(|Attribute { key: name, value }| {
let (opt_ns, local_name) = r.resolve_attribute(name);
(opt_ns, local_name.into_inner(), value)
});
assert_eq!(
attrs.next(),
Some((Unbound, &b"att1"[..], Cow::Borrowed(&b"a"[..])))
);
assert_eq!(
attrs.next(),
Some((
Bound(Namespace(b"urn:example:r")),
&b"att2"[..],
Cow::Borrowed(&b"b"[..])
))
);
assert_eq!(attrs.next(), None);
}
match r.read_resolved_event() {
Ok((Unbound, End(e))) => assert_eq!(e.name(), QName(b"a")),
e => panic!("Expecting End event, got {:?}", e),
}
}
#[test]
fn default_ns_shadowing_empty() {
let src = "<e xmlns='urn:example:o'><e att1='a' xmlns='urn:example:i' /></e>";
let mut r = NsReader::from_str(src);
r.trim_text(true).expand_empty_elements(false);
{
match r.read_resolved_event() {
Ok((ns, Start(e))) => {
assert_eq!(ns, Bound(Namespace(b"urn:example:o")));
assert_eq!(e.name(), QName(b"e"));
}
e => panic!("Expected Start event (<outer>), got {:?}", e),
}
}
{
let e = match r.read_resolved_event() {
Ok((ns, Empty(e))) => {
assert_eq!(ns, Bound(Namespace(b"urn:example:i")));
assert_eq!(e.name(), QName(b"e"));
e
}
e => panic!("Expecting Empty event, got {:?}", e),
};
let mut attrs = e
.attributes()
.map(|ar| ar.expect("Expecting attribute parsing to succeed."))
.filter(|kv| kv.key.as_namespace_binding().is_none())
.map(|Attribute { key: name, value }| {
let (opt_ns, local_name) = r.resolve_attribute(name);
(opt_ns, local_name.into_inner(), value)
});
assert_eq!(
attrs.next(),
Some((Unbound, &b"att1"[..], Cow::Borrowed(&b"a"[..])))
);
assert_eq!(attrs.next(), None);
}
match r.read_resolved_event() {
Ok((ns, End(e))) => {
assert_eq!(ns, Bound(Namespace(b"urn:example:o")));
assert_eq!(e.name(), QName(b"e"));
}
e => panic!("Expected End event (<outer>), got {:?}", e),
}
}
#[test]
fn default_ns_shadowing_expanded() {
let src = "<e xmlns='urn:example:o'><e att1='a' xmlns='urn:example:i' /></e>";
let mut r = NsReader::from_str(src);
r.trim_text(true).expand_empty_elements(true);
{
match r.read_resolved_event() {
Ok((ns, Start(e))) => {
assert_eq!(ns, Bound(Namespace(b"urn:example:o")));
assert_eq!(e.name(), QName(b"e"));
}
e => panic!("Expected Start event (<outer>), got {:?}", e),
}
}
{
let e = match r.read_resolved_event() {
Ok((ns, Start(e))) => {
assert_eq!(ns, Bound(Namespace(b"urn:example:i")));
assert_eq!(e.name(), QName(b"e"));
e
}
e => panic!("Expecting Start event (<inner>), got {:?}", e),
};
let mut attrs = e
.attributes()
.map(|ar| ar.expect("Expecting attribute parsing to succeed."))
.filter(|kv| kv.key.as_namespace_binding().is_none())
.map(|Attribute { key: name, value }| {
let (opt_ns, local_name) = r.resolve_attribute(name);
(opt_ns, local_name.into_inner(), value)
});
assert_eq!(
attrs.next(),
Some((Unbound, &b"att1"[..], Cow::Borrowed(&b"a"[..])))
);
assert_eq!(attrs.next(), None);
}
match r.read_resolved_event() {
Ok((ns, End(e))) => {
assert_eq!(ns, Bound(Namespace(b"urn:example:i")));
assert_eq!(e.name(), QName(b"e"));
}
e => panic!("Expected End event (</inner>), got {:?}", e),
}
match r.read_resolved_event() {
Ok((ns, End(e))) => {
assert_eq!(ns, Bound(Namespace(b"urn:example:o")));
assert_eq!(e.name(), QName(b"e"));
}
e => panic!("Expected End event (</outer>), got {:?}", e),
}
}
#[test]
fn reserved_name() {
let mut r =
NsReader::from_str(r#"<a xmlns-something="reserved attribute name" xmlns="www1"/>"#);
r.trim_text(true);
match r.read_resolved_event() {
Ok((ns, Empty(_))) => assert_eq!(ns, Bound(Namespace(b"www1"))),
e => panic!(
"Expected empty element bound to namespace 'www1', got {:?}",
e
),
}
}