#![allow(
unused_variables,
clippy::disallowed_names,
clippy::many_single_char_names
)]
pub use select::document::Document;
pub use select::node;
pub use select::predicate::*;
use speculate::speculate;
speculate! {
describe "predicate" {
before {
let document = Document::from("
\
foo\
\
");
let html = document.nth(0).unwrap();
let head = document.nth(1).unwrap();
let body = document.nth(2).unwrap();
let article = document.nth(3).unwrap();
let foo = document.nth(4).unwrap();
let comment = document.nth(5).unwrap();
let a = document.nth(6).unwrap();
let b = document.nth(7).unwrap();
let c = document.nth(8).unwrap();
let d = document.nth(9).unwrap();
}
test "Any" {
assert!(super::Any.matches(&html));
assert!(super::Any.matches(&head));
assert!(super::Any.matches(&body));
assert!(super::Any.matches(&article));
}
test "Name()" {
assert!(Name("html").matches(&html));
assert!(!Name("head").matches(&html));
assert!(!Name("body").matches(&html));
assert!(!Name("html").matches(&head));
assert!(Name("head").matches(&head));
assert!(!Name("body").matches(&head));
assert!(!Name("html").matches(&body));
assert!(!Name("head").matches(&body));
assert!(Name("body").matches(&body));
}
test "Class()" {
assert!(!Class("post").matches(&html));
assert!(Class("post").matches(&article));
assert!(Class("category-foo").matches(&article));
assert!(Class("tag-bar").matches(&article));
assert!(!Class("foo").matches(&article));
assert!(!Class("bar").matches(&article));
}
test "Not()" {
assert!(!Not(Name("html")).matches(&html));
assert!(Not(Name("html")).matches(&head));
assert!(Not(Name("head")).matches(&html));
assert!(!Not(Name("head")).matches(&head));
}
test "Attr()" {
assert!(!Attr("id", "post-0").matches(&html));
assert!(Attr("id", "post-0").matches(&article));
assert!(!Attr("id", ()).matches(&html));
assert!(Attr("id", ()).matches(&article));
}
test "Fn(&Node) -> bool" {
let f = |node: &node::Node| node.name() == Some("html");
assert!(f.matches(&html));
assert!(!f.matches(&head));
assert!(!f.matches(&body));
}
test "Element" {
assert!(super::Element.matches(&html));
assert!(super::Element.matches(&head));
assert!(super::Element.matches(&body));
assert!(super::Element.matches(&article));
assert!(!super::Element.matches(&foo));
}
test "Text" {
assert!(!super::Text.matches(&html));
assert!(!super::Text.matches(&head));
assert!(!super::Text.matches(&body));
assert!(!super::Text.matches(&article));
assert!(super::Text.matches(&foo));
assert!(!super::Text.matches(&comment));
}
test "Comment" {
assert!(!super::Comment.matches(&html));
assert!(!super::Comment.matches(&head));
assert!(!super::Comment.matches(&body));
assert!(!super::Comment.matches(&article));
assert!(!super::Comment.matches(&foo));
assert!(super::Comment.matches(&comment));
}
test "Or()" {
let html_or_head = Or(Name("html"), Name("head"));
assert!(html_or_head.matches(&html));
assert!(html_or_head.matches(&head));
assert!(!html_or_head.matches(&body));
assert!(!html_or_head.matches(&article));
assert!(!html_or_head.matches(&foo));
}
test "And()" {
let article_and_post_0 = And(Name("article"), Attr("id", "post-0"));
assert!(!article_and_post_0.matches(&html));
assert!(!article_and_post_0.matches(&head));
assert!(!article_and_post_0.matches(&body));
assert!(article_and_post_0.matches(&article));
assert!(!article_and_post_0.matches(&foo));
}
test "Child()" {
let html_article = Child(Name("html"), Name("article"));
assert!(!html_article.matches(&html));
assert!(!html_article.matches(&article));
let body_article = Child(Name("body"), Name("article"));
assert!(!body_article.matches(&html));
assert!(body_article.matches(&article));
}
test "Descendant()" {
let check = |parent: &str, child: &str, matching: Option| {
let selector = Descendant(Class(parent), Class(child));
for node in &[a, b, c, d] {
let expected = matching.map_or(false, |index| node.index() == index);
assert_eq!(selector.matches(node), expected);
}
};
check("a", "a", None);
check("a", "b", Some(b.index()));
check("a", "c", Some(c.index()));
check("a", "d", Some(d.index()));
check("b", "a", None);
check("b", "b", None);
check("b", "c", Some(c.index()));
check("b", "d", Some(d.index()));
check("c", "a", None);
check("c", "b", None);
check("c", "c", None);
check("c", "d", Some(d.index()));
check("d", "a", None);
check("d", "b", None);
check("d", "c", None);
check("d", "d", None);
}
// https://github.com/utkarshkukreti/select.rs/issues/35
test "Box" {
let post_0: Box = Box::new(Attr("id", "post-0"));
assert!(!post_0.matches(&html));
assert!(!post_0.matches(&head));
assert!(post_0.matches(&article));
let not_html: Box = Box::new(Not(Name("html")));
assert!(!not_html.matches(&html));
assert!(not_html.matches(&head));
assert!(not_html.matches(&article));
}
}
}