use sup_xml::{parse_str, xpath_str, ParseOptions};
fn text_of(xml: &str) -> String {
let d = parse_str(xml, &ParseOptions::default())
.expect("test document must parse");
xpath_str(&d, "string(/r)").unwrap()
}
#[test]
fn crlf_in_text_normalizes_to_lf() {
assert_eq!(text_of("<r>a\r\nb</r>"), "a\nb");
}
#[test]
fn lone_cr_in_text_normalizes_to_lf() {
assert_eq!(text_of("<r>a\rb</r>"), "a\nb");
}
#[test]
fn multiple_crlf_runs_normalize() {
assert_eq!(text_of("<r>a\r\nb\r\nc</r>"), "a\nb\nc");
}
#[test]
fn cr_at_end_of_text_normalizes() {
assert_eq!(text_of("<r>abc\r</r>"), "abc\n");
}
#[test]
fn lf_alone_is_left_intact() {
assert_eq!(text_of("<r>a\nb</r>"), "a\nb");
}
#[test]
fn cr_inside_cdata_normalizes_to_lf() {
let d = parse_str("<r><![CDATA[a\r\nb]]></r>", &ParseOptions::default()).unwrap();
assert_eq!(xpath_str(&d, "string(/r)").unwrap(), "a\nb");
}
#[test]
fn cr_char_ref_is_not_normalized() {
let d = parse_str("<r>a
b</r>", &ParseOptions::default()).unwrap();
assert_eq!(xpath_str(&d, "string(/r)").unwrap(), "a\rb");
}
#[test]
fn cr_lf_char_refs_are_not_normalized() {
let d = parse_str("<r>a
b</r>", &ParseOptions::default()).unwrap();
assert_eq!(xpath_str(&d, "string(/r)").unwrap(), "a\r\nb");
}
#[test]
fn crlf_split_across_entity_boundary_does_not_merge() {
let d = parse_str(
r#"<!DOCTYPE r [<!ENTITY foo "
">]><r>a&foo;b</r>"#,
&ParseOptions::default(),
).unwrap();
let s = xpath_str(&d, "string(/r)").unwrap();
assert_eq!(s, "a\nb");
}
#[test]
fn cr_followed_by_entity_then_lf_yields_two_lfs() {
let d = parse_str(
"<!DOCTYPE r [<!ENTITY foo \"\">]><r>a\r&foo;\nb</r>",
&ParseOptions::default(),
).unwrap();
assert_eq!(xpath_str(&d, "string(/r)").unwrap(), "a\n\nb");
}