use std::io::Cursor;
use tracing_test::traced_test;
use xml_canonicalization::Canonicalizer;
#[test]
#[traced_test]
fn example_3_1() {
let input = r#"<?xml version="1.0"?>
<?xml-stylesheet href="doc.xsl"
type="text/xsl" ?>
<!DOCTYPE doc SYSTEM "doc.dtd">
<doc>Hello, world!<!-- Comment 1 --></doc>
<?pi-without-data ?>
<!-- Comment 2 -->
<!-- Comment 3 -->"#;
let canonical_uncommented = r#"<?xml-stylesheet href="doc.xsl"
type="text/xsl" ?>
<doc>Hello, world!</doc>
<?pi-without-data?>"#;
let canonical_commented = r#"<?xml-stylesheet href="doc.xsl"
type="text/xsl" ?>
<doc>Hello, world!<!-- Comment 1 --></doc>
<?pi-without-data?>
<!-- Comment 2 -->
<!-- Comment 3 -->"#;
let mut result = vec![];
Canonicalizer::read_from_str(input)
.write_to_writer(Cursor::new(&mut result))
.canonicalize(true)
.expect("canonicalization shouldn't fail");
assert_eq!(String::from_utf8_lossy(&result), canonical_commented);
let mut result = vec![];
Canonicalizer::read_from_str(input)
.write_to_writer(Cursor::new(&mut result))
.canonicalize(false)
.expect("canonicalization shouldn't fail");
assert_eq!(String::from_utf8_lossy(&result), canonical_uncommented);
}
#[test]
#[traced_test]
fn example_3_2() {
let input = r#"<doc>
<clean> </clean>
<dirty> A B </dirty>
<mixed>
A
<clean> </clean>
B
<dirty> A B </dirty>
C
</mixed>
</doc>"#;
let canonical = r#"<doc>
<clean> </clean>
<dirty> A B </dirty>
<mixed>
A
<clean> </clean>
B
<dirty> A B </dirty>
C
</mixed>
</doc>"#;
let mut result = vec![];
Canonicalizer::read_from_str(input)
.write_to_writer(Cursor::new(&mut result))
.canonicalize(true)
.expect("canonicalization shouldn't fail");
assert_eq!(String::from_utf8_lossy(&result), canonical);
}
#[test]
#[traced_test]
fn example_3_3() {
let input = r#"<!DOCTYPE doc [<!ATTLIST e9 attr CDATA "default">]>
<doc>
<e1 />
<e2 ></e2>
<e3 name = "elem3" id="elem3" />
<e4 name="elem4" id="elem4" ></e4>
<e5 a:attr="out" b:attr="sorted" attr2="all" attr="I'm"
xmlns:b="http://www.ietf.org"
xmlns:a="http://www.w3.org"
xmlns="http://example.org"/>
<e6 xmlns="" xmlns:a="http://www.w3.org">
<e7 xmlns="http://www.ietf.org">
<e8 xmlns="" xmlns:a="http://www.w3.org">
<e9 xmlns="" xmlns:a="http://www.ietf.org"/>
</e8>
</e7>
</e6>
</doc>"#;
let canonical = r#"<doc>
<e1></e1>
<e2></e2>
<e3 id="elem3" name="elem3"></e3>
<e4 id="elem4" name="elem4"></e4>
<e5 xmlns="http://example.org" xmlns:a="http://www.w3.org" xmlns:b="http://www.ietf.org" attr="I'm" attr2="all" b:attr="sorted" a:attr="out"></e5>
<e6 xmlns:a="http://www.w3.org">
<e7 xmlns="http://www.ietf.org">
<e8 xmlns="">
<e9 xmlns:a="http://www.ietf.org"></e9>
</e8>
</e7>
</e6>
</doc>"#;
let mut result = vec![];
Canonicalizer::read_from_str(input)
.write_to_writer(Cursor::new(&mut result))
.canonicalize(true)
.expect("canonicalization shouldn't fail");
assert_eq!(String::from_utf8_lossy(&result), canonical);
}
#[test]
#[traced_test]
fn example_3_4() {
let input = r#"<!DOCTYPE doc [
<!ATTLIST normId id ID #IMPLIED>
<!ATTLIST normNames attr NMTOKENS #IMPLIED>
]>
<doc>
<text>First line
 Second line</text>
<value>2</value>
<compute><![CDATA[value>"0" && value<"10" ?"valid":"error"]]></compute>
<compute expr='value>"0" && value<"10" ?"valid":"error"'>valid</compute>
<norm attr=' '   
	 ' '/>
</doc>"#;
let canonical = r#"<doc>
<text>First line
Second line</text>
<value>2</value>
<compute>value>"0" && value<"10" ?"valid":"error"</compute>
<compute expr="value>"0" && value<"10" ?"valid":"error"">valid</compute>
<norm attr=" ' 
	 ' "></norm>
</doc>"#;
let mut result = vec![];
Canonicalizer::read_from_str(input)
.write_to_writer(Cursor::new(&mut result))
.canonicalize(true)
.expect("canonicalization shouldn't fail");
assert_eq!(String::from_utf8_lossy(&result), canonical);
}
#[test]
#[traced_test]
fn example_3_6() {
let input = r#"<?xml version="1.0" encoding="ISO-8859-1"?>
<doc>©</doc>"#;
let canonical = r#"<doc>©</doc>"#;
let mut result = vec![];
Canonicalizer::read_from_str(input)
.write_to_writer(Cursor::new(&mut result))
.canonicalize(true)
.expect("canonicalization shouldn't fail");
assert_eq!(String::from_utf8_lossy(&result), canonical);
}