use qualname::NamespacePrefix;
use std::fs;
use xrust::item::{Node, NodeType};
use xrust::parser::xml;
use xrust::parser::{ParseError, ParserStateBuilder, StaticStateBuilder};
use xrust::trees::smite::RNode;
#[test]
fn parser_config_namespace_nodes_1() {
let doc = r#"<doc xmlns="namespace"
xmlns:a="namespace1"
xmlns:b="namespace2"
xmlns:c="namespace3"
xmlns:d="namespace4"
xmlns:e="namespace5"
>
<element1/>
<element2 xmlns="namespace6"/>
<element3 xmlns:f="namespace7"/>
<element4 xmlns:f="namespace8"/>
<element5>
<element6/>
</element5>
</doc>"#;
let testxml = RNode::new_document();
let parseresult = xml::parse(
testxml,
doc,
Some(|_: &_| Err(ParseError::MissingNameSpace)),
);
assert!(parseresult.is_ok());
let doc = parseresult.clone().unwrap().first_child().unwrap();
let mut docchildren = doc
.child_iter()
.filter(|n| n.node_type() == NodeType::Element);
let element1 = docchildren.next().unwrap();
let element2 = docchildren.next().unwrap();
let element3 = docchildren.next().unwrap();
let element4 = docchildren.next().unwrap();
let element5 = docchildren.next().unwrap();
let element6 = element5
.child_iter()
.filter(|n| n.node_type() == NodeType::Element)
.next()
.unwrap();
assert_eq!(doc.namespace_iter().count(), 7);
assert_eq!(element1.namespace_iter().count(), 7);
assert_eq!(element2.namespace_iter().count(), 8);
assert_eq!(element3.namespace_iter().count(), 8);
assert_eq!(element4.namespace_iter().count(), 8);
assert_eq!(element5.namespace_iter().count(), 7);
assert_eq!(element6.namespace_iter().count(), 7);
}
#[test]
fn parser_config_default_attrs_1() {
let doc = r#"<!DOCTYPE doc [
<!ELEMENT doc EMPTY>
<!ATTLIST doc a CDATA "a" b CDATA "b" c CDATA #IMPLIED>
]>
<doc/>"#;
let testxml1 = RNode::new_document();
let parseresult1 = xml::parse(
testxml1,
doc,
Some(|_: &_| Err(ParseError::MissingNameSpace)),
);
let testxml2 = RNode::new_document();
let pc2 = ParserStateBuilder::new()
.attribute_defaults(false)
.doc(testxml2)
.build();
let ss = StaticStateBuilder::new()
.namespace(|_: &_| Err(ParseError::MissingNameSpace))
.build();
let parseresult2 = xml::parse_with_state(doc, pc2, ss);
assert!(parseresult1.is_ok());
assert!(parseresult2.is_ok());
assert_eq!(
parseresult1
.clone()
.unwrap()
.first_child()
.unwrap()
.attribute_iter()
.count(),
2
);
assert_eq!(
parseresult2
.clone()
.unwrap()
.first_child()
.unwrap()
.attribute_iter()
.count(),
0
);
}
#[test]
fn parser_issue_94() {
let data = fs::read_to_string("tests/xml/issue-94.xml").unwrap();
let source = RNode::new_document();
let parseresult = xml::parse(
source.clone(),
&data,
Some(|_: &_| Err(ParseError::MissingNameSpace)),
);
assert!(parseresult.is_ok())
}
#[test]
fn parser_config_id_1() {
let doc = r#"<!DOCTYPE root [
<!ELEMENT doc ANY>
<!ELEMENT element1 EMPTY>
<!ATTLIST element1
id ID #IMPLIED
idref IDREF #IMPLIED
>
]>
<doc>
<element1 id="a1"/>
<element1 id="a1"/>
</doc>
"#;
let testxml = RNode::new_document();
let parseresult = xml::parse(
testxml,
doc,
Some(|_: &_| {
Err(ParseError::NotWellFormed(
"tried to resolve namespace prefix".to_string(),
))
}),
);
eprintln!("parse1result {:?}", parseresult);
assert!(parseresult.is_err());
let testxml2 = RNode::new_document();
let pc2 = ParserStateBuilder::new()
.id_tracking(false)
.doc(testxml2)
.build();
let ss = StaticStateBuilder::new()
.namespace(|_: &_| Err(ParseError::MissingNameSpace))
.build();
let parseresult2 = xml::parse_with_state(doc, pc2, ss);
eprintln!("parseresult2 result {:?}", parseresult2);
assert!(parseresult2.is_ok());
}
#[test]
fn parser_config_id_2() {
let doc = r#"<!DOCTYPE root [
<!ELEMENT doc ANY>
<!ELEMENT element1 EMPTY>
<!ATTLIST element1
id ID #IMPLIED
idref IDREF #IMPLIED
>
]>
<doc>
<element1 idref="a1"/>
</doc>
"#;
let testxml = RNode::new_document();
let parseresult = xml::parse(
testxml,
doc,
Some(|_: &_| Err(ParseError::MissingNameSpace)),
);
assert!(parseresult.is_err());
let testxml2 = RNode::new_document();
let pc2 = ParserStateBuilder::new()
.id_tracking(false)
.doc(testxml2)
.build();
let ss = StaticStateBuilder::new()
.namespace(|_: &_| Err(ParseError::MissingNameSpace))
.build();
let parseresult2 = xml::parse_with_state(doc, pc2, ss);
assert!(parseresult2.is_ok());
}
#[test]
fn parser_config_id_3() {
let doc = r#"<!DOCTYPE root [
<!ELEMENT doc ANY>
<!ATTLIST doc
id ID #IMPLIED
idref IDREF #IMPLIED
>
]>
<doc id="a1"/>
"#;
let testxml = RNode::new_document();
let parseresult = xml::parse(
testxml,
doc,
Some(|_: &_| Err(ParseError::MissingNameSpace)),
);
assert!(parseresult.is_ok());
assert_eq!(
parseresult
.unwrap()
.first_child()
.unwrap()
.attribute_iter()
.next()
.unwrap()
.is_id(),
true
);
let testxml2 = RNode::new_document();
let pc2 = ParserStateBuilder::new()
.doc(testxml2)
.id_tracking(false)
.build();
let ss = StaticStateBuilder::new()
.namespace(|_: &_| Err(ParseError::MissingNameSpace))
.build();
let parseresult2 = xml::parse_with_state(doc, pc2, ss);
assert!(parseresult2.is_ok());
assert_eq!(
parseresult2
.unwrap()
.first_child()
.unwrap()
.attribute_iter()
.next()
.unwrap()
.is_id(),
false
);
}
#[test]
fn parser_config_id_4() {
let doc = r#"<!DOCTYPE root [
<!ELEMENT doc ANY>
<!ATTLIST doc
idref IDREF #IMPLIED
>
<!ELEMENT element1 EMPTY>
<!ATTLIST element1
id ID #IMPLIED
>
]>
<doc idref="a1">
<element1 id="a1"/>
</doc>
"#;
let testxml = RNode::new_document();
let parseresult = xml::parse(
testxml,
doc,
Some(|_: &_| Err(ParseError::MissingNameSpace)),
);
assert!(parseresult.is_ok());
assert_eq!(
parseresult
.unwrap()
.first_child()
.unwrap()
.attribute_iter()
.next()
.unwrap()
.is_idrefs(),
true
);
let testxml2 = RNode::new_document();
let pc2 = ParserStateBuilder::new()
.doc(testxml2)
.id_tracking(false)
.build();
let ss = StaticStateBuilder::new()
.namespace(|_: &_| Err(ParseError::MissingNameSpace))
.build();
let parseresult2 = xml::parse_with_state(doc, pc2, ss);
assert!(parseresult2.is_ok());
assert_eq!(
parseresult2
.unwrap()
.first_child()
.unwrap()
.attribute_iter()
.next()
.unwrap()
.is_idrefs(),
false
);
}
#[test]
fn parser_issue_132_full() {
let doc = r###"<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:mml="http://www.w3.org/1998/Math/MathML"
xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math">
<xsl:output method="xml" encoding="UTF-16" />
<!-- %% Global Definitions -->
<!-- Every single unicode character that is recognized by OMML as an operator -->
<xsl:variable name="sOperators"
select="concat(
'¨!"#&()+,-./:',
';<=>?@[\]^_`{',
'|}~¡¦¬¯°±²³´·¹¿',
'×~÷ˇ˘˙˜˝̀́̂̃̄̅̆̇̈̉',
'̊̋̌̍̎̏̐̑̒̓̔̕',
'̡̛̖̗̘̙̜̝̞̟̠̚',
'̢̧̨̣̤̥̦̩̪̫̬̭',
'̴̵̶̷̸̮̯̰̱̲̳̿',
'         ‐‒–',
'—‖†‡•․‥…′″‴‼',
'⁀⁄⁎⁏⁐⁗⁡⁢⁣⁰⁴⁵',
'⁶⁷⁸⁹⁺⁻⁼⁽⁾₀₁₂',
'₃₄₅₆₇₈₉₊₋₌₍₎',
'⃒⃓⃘⃙⃚⃐⃑⃔⃕⃖⃗⃛',
'⃜⃝⃞⃟⃠⃡⃤⃥⃦⃨⃧⃩',
'⃪⅀ⅆ←↑→↓↔↕↖↗↘↙',
'↚↛↜↝↞↟↠↡↢↣↤↥',
'↦↧↨↩↪↫↬↭↮↯↰↱',
'↲↳↶↷↺↻↼↽↾↿⇀⇁',
'⇂⇃⇄⇅⇆⇇⇈⇉⇊⇋⇌⇍',
'⇎⇏⇐⇑⇒⇓⇔⇕⇖⇗⇘⇙',
'⇚⇛⇜⇝⇞⇟⇠⇡⇢⇣⇤⇥',
'⇦⇧⇨⇩⇳⇴⇵⇶⇷⇸⇹⇺',
'⇻⇼⇽⇾⇿∀∁∂∃∄∆∇',
'∈∉∊∋∌∍∏∐∑−∓∔',
'∕∖∗∘∙√∛∜∝∣∤∥',
'∦∧∨∩∪∫∬∭∮∯∰∱',
'∲∳∴∵∶∷∸∹∺∻∼∽',
'∾≀≁≂≃≄≅≆≇≈≉≊',
'≋≌≍≎≏≐≑≒≓≔≕≖',
'≗≘≙≚≛≜≝≞≟≠≡≢',
'≣≤≥≦≧≨≩≪≫≬≭≮',
'≯≰≱≲≳≴≵≶≷≸≹≺',
'≻≼≽≾≿⊀⊁⊂⊃⊄⊅⊆',
'⊇⊈⊉⊊⊋⊌⊍⊎⊏⊐⊑⊒',
'⊓⊔⊕⊖⊗⊘⊙⊚⊛⊜⊝⊞',
'⊟⊠⊡⊢⊣⊥⊦⊧⊨⊩⊪⊫',
'⊬⊭⊮⊯⊰⊱⊲⊳⊴⊵⊶⊷',
'⊸⊹⊺⊻⊼⊽⋀⋁⋂⋃⋄⋅',
'⋆⋇⋈⋉⋊⋋⋌⋍⋎⋏⋐⋑',
'⋒⋓⋔⋕⋖⋗⋘⋙⋚⋛⋜⋝',
'⋞⋟⋠⋡⋢⋣⋤⋥⋦⋧⋨⋩',
'⋪⋫⋬⋭⋮⋯⋰⋱⋲⋳⋴⋵',
'⋶⋷⋸⋹⋺⋻⋼⋽⋾⋿⌅⌆',
'⌈⌉⌊⌋⌜⌝⌞⌟⌢⌣〈〉',
'⌽⌿⎰⎱⏜⏝⏞⏟⏠│├┤',
'┬┴▁█▒■□▭▲△▴▵',
'▶▷▸▹▼▽▾▿◀◁◂◃',
'◄◅◊○◦◫◬◸◹◺◻◼',
'◽◾◿★☆❲❳⟑⟒⟓⟔⟕',
'⟖⟗⟘⟙⟚⟛⟜⟝⟞⟟⟠⟡',
'⟢⟣⟤⟥⟦⟧⟨⟩⟪⟫⟰⟱',
'⟲⟳⟴⟵⟶⟷⟸⟹⟺⟻⟼⟽',
'⟾⟿⤀⤁⤂⤃⤄⤅⤆⤇⤈⤉',
'⤊⤋⤌⤍⤎⤏⤐⤑⤒⤓⤔⤕',
'⤖⤗⤘⤙⤚⤛⤜⤝⤞⤟⤠⤡',
'⤢⤣⤤⤥⤦⤧⤨⤩⤪⤫⤬⤭',
'⤮⤯⤰⤱⤲⤳⤴⤵⤶⤷⤸⤹',
'⤺⤻⤼⤽⤾⤿⥀⥁⥂⥃⥄⥅',
'⥆⥇⥈⥉⥊⥋⥌⥍⥎⥏⥐⥑',
'⥒⥓⥔⥕⥖⥗⥘⥙⥚⥛⥜⥝',
'⥞⥟⥠⥡⥢⥣⥤⥥⥦⥧⥨⥩',
'⥪⥫⥬⥭⥮⥯⥰⥱⥲⥳⥴⥵',
'⥶⥷⥸⥹⥺⥻⥼⥽⥾⥿⦀⦂',
'⦃⦄⦅⦆⦇⦈⦉⦊⦋⦌⦍⦎',
'⦏⦐⦑⦒⦓⦔⦕⦖⦗⦘⦙⦚',
'⦶⦷⦸⦹⧀⧁⧄⧅⧆⧇⧈⧎',
'⧏⧐⧑⧒⧓⧔⧕⧖⧗⧘⧙⧚',
'⧛⧟⧡⧢⧣⧤⧥⧦⧫⧴⧵⧶',
'⧷⧸⧹⧺⧻⧼⧽⧾⧿⨀⨁⨂',
'⨃⨄⨅⨆⨇⨈⨉⨊⨋⨌⨍⨎',
'⨏⨐⨑⨒⨓⨔⨕⨖⨗⨘⨙⨚',
'⨛⨜⨝⨞⨟⨠⨡⨢⨣⨤⨥⨦',
'⨧⨨⨩⨪⨫⨬⨭⨮⨯⨰⨱⨲',
'⨳⨴⨵⨶⨷⨸⨹⨺⨻⨼⨽⨾',
'⨿⩀⩁⩂⩃⩄⩅⩆⩇⩈⩉⩊',
'⩋⩌⩍⩎⩏⩐⩑⩒⩓⩔⩕⩖',
'⩗⩘⩙⩚⩛⩜⩝⩞⩟⩠⩡⩢',
'⩣⩤⩥⩦⩧⩨⩩⩪⩫⩬⩭⩮',
'⩯⩰⩱⩲⩳⩴⩵⩶⩷⩸⩹⩺',
'⩻⩼⩽⩾⩿⪀⪁⪂⪃⪄⪅⪆',
'⪇⪈⪉⪊⪋⪌⪍⪎⪏⪐⪑⪒',
'⪓⪔⪕⪖⪗⪘⪙⪚⪛⪜⪝⪞',
'⪟⪠⪡⪢⪣⪤⪥⪦⪧⪨⪩⪪',
'⪫⪬⪭⪮⪯⪰⪱⪲⪳⪴⪵⪶',
'⪷⪸⪹⪺⪻⪼⪽⪾⪿⫀⫁⫂',
'⫃⫄⫅⫆⫇⫈⫉⫊⫋⫌⫍⫎',
'⫏⫐⫑⫒⫓⫔⫕⫖⫗⫘⫙⫚',
'⫛⫝̸⫝⫞⫟⫠⫢⫣⫤⫥⫦⫧',
'⫨⫩⫪⫫⫬⫭⫮⫯⫰⫲⫳⫴',
'⫵⫶⫷⫸⫹⫺⫻⫼⫽⫾⫿⬄',
'⬆⬇⬌⬍〔〕〖〗〘〙!&',
'()+,-./:;<=>',
'?@[\]^_{|}')" />
</xsl:stylesheet>
"###;
let testxml = RNode::new_document();
let parseresult = xml::parse(
testxml,
doc,
Some(|_: &_| Err(ParseError::MissingNameSpace)),
);
assert!(parseresult.is_ok());
}
#[test]
fn parser_issue_132_minimal() {
let doc = r###"<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<test value="<">empty</test>
</xsl:stylesheet>
"###;
let testxml = RNode::new_document();
let parseresult = xml::parse(
testxml,
doc,
Some(|p: &NamespacePrefix| {
Err(ParseError::NotWellFormed(format!(
"prefix: {}",
p.to_string()
)))
}),
);
assert!(parseresult.is_ok());
}