use rquery::{ Document, Element, SelectError, UnexpectedTokenError }; pub fn new_document() -> Document { Document::new_from_xml_string(r#" This is some text Simple Sample Some unrecognisable scribbling Another Sample http://path.to.somewhere Other Sample http://some.other.path
"#).unwrap() } #[test] fn it_supports_the_tag_selector() { let document = new_document(); let elements: Vec<&Element> = document.select_all("note").unwrap().collect(); assert_eq!(elements.len(), 1); assert_eq!(elements[0].tag_name(), "note"); } #[test] fn it_supports_the_nested_tag_selector() { let document = new_document(); let elements: Vec<&Element> = document.select_all("related title").unwrap().collect(); assert_eq!(elements.len(), 2); let element_tag_names: Vec = elements.iter() .map(|el| el.tag_name().to_string()) .collect(); assert_eq!(element_tag_names, vec!("title", "title")); } #[test] fn it_supports_nesting_selectors() { let document = new_document(); let elements: Vec<&Element> = document.select_all("related").unwrap() .flat_map(|element| element.select_all("title").unwrap()) .collect(); assert_eq!(elements.len(), 2); let element_tag_names: Vec = elements.iter() .map(|el| el.tag_name().to_string()) .collect(); assert_eq!(element_tag_names, vec!("title", "title")); } #[test] fn it_supports_the_direct_child_tag_selector() { let document = new_document(); let elements: Vec<&Element> = document.select_all("sample > title").unwrap().collect(); assert_eq!(elements.len(), 1); let element = elements[0]; assert_eq!(element.tag_name(), "title"); } #[test] fn it_returns_a_no_match_error_when_the_selector_does_not_match_any_element() { let document = new_document(); let result = document.select("nonexistentelement"); if let Err(err) = result { assert_eq!(err, SelectError::NoMatchError); } else { panic!("The select did not result in an error!"); } } #[test] fn it_returns_a_parse_error_when_the_selector_is_invalid() { let document = new_document(); let result = document.select_all("?"); if let Err(err) = result { assert_eq!(err, SelectError::ParseError(UnexpectedTokenError('?'))); } else { panic!("The invalid selector did not result in an error!"); } } #[test] fn it_supports_the_attribute_selector() { let document = new_document(); let elements: Vec<&Element> = document.select_all(r#"[long="false"]"#).unwrap().collect(); assert_eq!(elements.len(), 1); let element = elements[0]; assert_eq!(element.text(), "Some unrecognisable scribbling"); } #[test] fn it_supports_the_id_selector() { let document = new_document(); let elements: Vec<&Element> = document.select_all("#id-1").unwrap().collect(); assert_eq!(elements.len(), 1); let element = elements[0]; assert_eq!(element.tag_name(), "item"); assert_eq!(element.attr("id"), Some(&"id-1".to_string())); } #[test] fn it_supports_the_compound_selectors() { let document = new_document(); let elements: Vec<&Element> = document.select_all("div[type=three]").unwrap().collect(); assert_eq!(elements.len(), 1); let element = elements[0]; assert_eq!(element.tag_name(), "div"); assert_eq!(element.attr("type"), Some(&"three".to_string())); } #[test] fn it_does_not_repeat_elements() { let document = new_document(); let unique_count = document.select_all("div").unwrap().count(); assert_eq!(unique_count, 8); let direct_nested_count = document.select_all("div > div").unwrap().count(); assert_eq!(direct_nested_count, 5); let nested_count = document.select_all("div div").unwrap().count(); assert_eq!(nested_count, 6); }