Skip to content

Commit

Permalink
finish remaining tests
Browse files Browse the repository at this point in the history
  • Loading branch information
Kiyoshika committed Nov 9, 2023
1 parent 0e483a2 commit 38ac759
Showing 1 changed file with 296 additions and 1 deletion.
297 changes: 296 additions & 1 deletion src/html5/parser/document.rs
Original file line number Diff line number Diff line change
Expand Up @@ -445,7 +445,9 @@ impl Document {
if let Some(node) = self.get_node_by_id(node_id) {
for child_id in &node.children {
if let Some(child) = self.get_node_by_id(*child_id) {
return child.name == tag;
if child.name == tag {
return true;
}
}
}
}
Expand Down Expand Up @@ -1394,4 +1396,297 @@ mod tests {
assert_eq!(found_ids.len(), 4);
assert_eq!(found_ids, [p_id, p_id_2, p_id_3, p_id_4]);
}

#[test]
fn single_query_equals_id() {
// <div>
// <div>
// <p>
// <p id="myid">
// <div>
// <p>
// <p>
let mut doc = DocumentBuilder::new_document();

let div_id = doc.create_element("div", NodeId::root(), None, HTML_NAMESPACE);
let div_id_2 = doc.create_element("div", div_id, None, HTML_NAMESPACE);
let _ = doc.create_element("p", div_id_2, None, HTML_NAMESPACE);
let p_id_2 = doc.create_element("p", div_id, None, HTML_NAMESPACE);
let res = doc.insert_attribute("id", "myid", p_id_2);
assert!(res.is_ok());

let div_id_3 = doc.create_element("div", NodeId::root(), None, HTML_NAMESPACE);
let _ = doc.create_element("p", div_id_3, None, HTML_NAMESPACE);

let _ = doc.create_element("p", NodeId::root(), None, HTML_NAMESPACE);

let query = Query::new().equals_id("myid").find_first();
let found_ids = doc.query(&query).unwrap();
assert_eq!(found_ids.len(), 1);
assert_eq!(found_ids, [p_id_2]);
}

#[test]
fn single_query_contains_class_find_first() {
// <div>
// <div>
// <p class="one two">
// <p class="one">
// <div>
// <p class="two three">
// <p class="three">
let mut doc = DocumentBuilder::new_document();

let div_id = doc.create_element("div", NodeId::root(), None, HTML_NAMESPACE);
let div_id_2 = doc.create_element("div", div_id, None, HTML_NAMESPACE);
let p_id = doc.create_element("p", div_id_2, None, HTML_NAMESPACE);
let mut res = doc.insert_attribute("class", "one two", p_id);
assert!(res.is_ok());
let p_id_2 = doc.create_element("p", div_id, None, HTML_NAMESPACE);
res = doc.insert_attribute("class", "one", p_id_2);
assert!(res.is_ok());
res = doc.insert_attribute("id", "myid", p_id_2);
assert!(res.is_ok());

let div_id_3 = doc.create_element("div", NodeId::root(), None, HTML_NAMESPACE);
let p_id_3 = doc.create_element("p", div_id_3, None, HTML_NAMESPACE);
res = doc.insert_attribute("class", "two three", p_id_3);
assert!(res.is_ok());

let p_id_4 = doc.create_element("p", NodeId::root(), None, HTML_NAMESPACE);
res = doc.insert_attribute("class", "three", p_id_4);
assert!(res.is_ok());

let query = Query::new().contains_class("two").find_first();
let found_ids = doc.query(&query).unwrap();
assert_eq!(found_ids.len(), 1);
assert_eq!(found_ids, [p_id]);
}

#[test]
fn single_query_contains_class_find_all() {
// <div>
// <div>
// <p class="one two">
// <p class="one">
// <div>
// <p class="two three">
// <p class="three">
let mut doc = DocumentBuilder::new_document();

let div_id = doc.create_element("div", NodeId::root(), None, HTML_NAMESPACE);
let div_id_2 = doc.create_element("div", div_id, None, HTML_NAMESPACE);
let p_id = doc.create_element("p", div_id_2, None, HTML_NAMESPACE);
let mut res = doc.insert_attribute("class", "one two", p_id);
assert!(res.is_ok());
let p_id_2 = doc.create_element("p", div_id, None, HTML_NAMESPACE);
res = doc.insert_attribute("class", "one", p_id_2);
assert!(res.is_ok());
res = doc.insert_attribute("id", "myid", p_id_2);
assert!(res.is_ok());

let div_id_3 = doc.create_element("div", NodeId::root(), None, HTML_NAMESPACE);
let p_id_3 = doc.create_element("p", div_id_3, None, HTML_NAMESPACE);
res = doc.insert_attribute("class", "two three", p_id_3);
assert!(res.is_ok());

let p_id_4 = doc.create_element("p", NodeId::root(), None, HTML_NAMESPACE);
res = doc.insert_attribute("class", "three", p_id_4);
assert!(res.is_ok());

let query = Query::new().contains_class("two").find_all();
let found_ids = doc.query(&query).unwrap();
assert_eq!(found_ids.len(), 2);
assert_eq!(found_ids, [p_id, p_id_3]);
}

#[test]
fn single_query_contains_attribute_find_first() {
// <div>
// <div id="myid" style="somestyle">
// <p title="hey">
// <p>
// <div style="otherstyle" id="otherid">
// <p>
// <p title="yo" style="cat">
let mut doc = DocumentBuilder::new_document();

let div_id = doc.create_element("div", NodeId::root(), None, HTML_NAMESPACE);
let div_id_2 = doc.create_element("div", div_id, None, HTML_NAMESPACE);
let mut res = doc.insert_attribute("id", "myid", div_id_2);
assert!(res.is_ok());
res = doc.insert_attribute("style", "somestyle", div_id_2);
assert!(res.is_ok());
let p_id = doc.create_element("p", div_id_2, None, HTML_NAMESPACE);
res = doc.insert_attribute("title", "key", p_id);
assert!(res.is_ok());
let _ = doc.create_element("p", div_id, None, HTML_NAMESPACE);

let div_id_3 = doc.create_element("div", NodeId::root(), None, HTML_NAMESPACE);
res = doc.insert_attribute("style", "otherstyle", div_id_3);
assert!(res.is_ok());
res = doc.insert_attribute("id", "otherid", div_id_3);
assert!(res.is_ok());
let _ = doc.create_element("p", div_id_3, None, HTML_NAMESPACE);

let p_id_4 = doc.create_element("p", NodeId::root(), None, HTML_NAMESPACE);
res = doc.insert_attribute("title", "yo", p_id_4);
assert!(res.is_ok());
res = doc.insert_attribute("style", "cat", p_id_4);
assert!(res.is_ok());

let query = Query::new().contains_attribute("style").find_first();
let found_ids = doc.query(&query).unwrap();
assert_eq!(found_ids.len(), 1);
assert_eq!(found_ids, [div_id_2]);
}

#[test]
fn single_query_contains_attribute_find_all() {
// <div>
// <div id="myid" style="somestyle">
// <p title="hey">
// <p>
// <div style="otherstyle" id="otherid">
// <p>
// <p title="yo" style="cat">
let mut doc = DocumentBuilder::new_document();

let div_id = doc.create_element("div", NodeId::root(), None, HTML_NAMESPACE);
let div_id_2 = doc.create_element("div", div_id, None, HTML_NAMESPACE);
let mut res = doc.insert_attribute("id", "myid", div_id_2);
assert!(res.is_ok());
res = doc.insert_attribute("style", "somestyle", div_id_2);
assert!(res.is_ok());
let p_id = doc.create_element("p", div_id_2, None, HTML_NAMESPACE);
res = doc.insert_attribute("title", "key", p_id);
assert!(res.is_ok());
let _ = doc.create_element("p", div_id, None, HTML_NAMESPACE);

let div_id_3 = doc.create_element("div", NodeId::root(), None, HTML_NAMESPACE);
res = doc.insert_attribute("style", "otherstyle", div_id_3);
assert!(res.is_ok());
res = doc.insert_attribute("id", "otherid", div_id_3);
assert!(res.is_ok());
let _ = doc.create_element("p", div_id_3, None, HTML_NAMESPACE);

let p_id_4 = doc.create_element("p", NodeId::root(), None, HTML_NAMESPACE);
res = doc.insert_attribute("title", "yo", p_id_4);
assert!(res.is_ok());
res = doc.insert_attribute("style", "cat", p_id_4);
assert!(res.is_ok());

let query = Query::new().contains_attribute("style").find_all();
let found_ids = doc.query(&query).unwrap();
assert_eq!(found_ids.len(), 3);
assert_eq!(found_ids, [div_id_2, div_id_3, p_id_4]);
}

#[test]
fn single_query_contains_child_find_first() {
// <div>
// <div>
// <p>
// <p>
// <div>
// <p>
// <p>
let mut doc = DocumentBuilder::new_document();

let div_id = doc.create_element("div", NodeId::root(), None, HTML_NAMESPACE);
let div_id_2 = doc.create_element("div", div_id, None, HTML_NAMESPACE);
let _ = doc.create_element("p", div_id_2, None, HTML_NAMESPACE);
let _ = doc.create_element("p", div_id, None, HTML_NAMESPACE);

let div_id_3 = doc.create_element("div", NodeId::root(), None, HTML_NAMESPACE);
let _ = doc.create_element("p", div_id_3, None, HTML_NAMESPACE);

let _ = doc.create_element("p", NodeId::root(), None, HTML_NAMESPACE);

let query = Query::new().contains_child_tag("p").find_first();
let found_ids = doc.query(&query).unwrap();
assert_eq!(found_ids.len(), 1);
assert_eq!(found_ids, [NodeId::root()]);
}

#[test]
fn single_query_contains_child_find_all() {
// <div>
// <div>
// <p>
// <p>
// <div>
// <p>
// <p>
let mut doc = DocumentBuilder::new_document();

let div_id = doc.create_element("div", NodeId::root(), None, HTML_NAMESPACE);
let div_id_2 = doc.create_element("div", div_id, None, HTML_NAMESPACE);
let _ = doc.create_element("p", div_id_2, None, HTML_NAMESPACE);
let _ = doc.create_element("p", div_id, None, HTML_NAMESPACE);

let div_id_3 = doc.create_element("div", NodeId::root(), None, HTML_NAMESPACE);
let _ = doc.create_element("p", div_id_3, None, HTML_NAMESPACE);

let _ = doc.create_element("p", NodeId::root(), None, HTML_NAMESPACE);

let query = Query::new().contains_child_tag("p").find_all();
let found_ids = doc.query(&query).unwrap();
assert_eq!(found_ids.len(), 4);
assert_eq!(found_ids, [NodeId::root(), div_id, div_id_2, div_id_3]);
}

#[test]
fn single_query_has_parent_find_first() {
// <div>
// <div>
// <p>
// <p>
// <div>
// <p>
// <p>
let mut doc = DocumentBuilder::new_document();

let div_id = doc.create_element("div", NodeId::root(), None, HTML_NAMESPACE);
let div_id_2 = doc.create_element("div", div_id, None, HTML_NAMESPACE);
let _ = doc.create_element("p", div_id_2, None, HTML_NAMESPACE);
let _ = doc.create_element("p", div_id, None, HTML_NAMESPACE);

let div_id_3 = doc.create_element("div", NodeId::root(), None, HTML_NAMESPACE);
let _ = doc.create_element("p", div_id_3, None, HTML_NAMESPACE);

let _ = doc.create_element("p", NodeId::root(), None, HTML_NAMESPACE);

let query = Query::new().has_parent_tag("div").find_first();
let found_ids = doc.query(&query).unwrap();
assert_eq!(found_ids.len(), 1);
assert_eq!(found_ids, [div_id_2]);
}

#[test]
fn single_query_has_parent_find_all() {
// <div>
// <div>
// <p>
// <p>
// <div>
// <p>
// <p>
let mut doc = DocumentBuilder::new_document();

let div_id = doc.create_element("div", NodeId::root(), None, HTML_NAMESPACE);
let div_id_2 = doc.create_element("div", div_id, None, HTML_NAMESPACE);
let p_id = doc.create_element("p", div_id_2, None, HTML_NAMESPACE);
let p_id_2 = doc.create_element("p", div_id, None, HTML_NAMESPACE);

let div_id_3 = doc.create_element("div", NodeId::root(), None, HTML_NAMESPACE);
let p_id_3 = doc.create_element("p", div_id_3, None, HTML_NAMESPACE);

let _ = doc.create_element("p", NodeId::root(), None, HTML_NAMESPACE);

let query = Query::new().has_parent_tag("div").find_all();
let found_ids = doc.query(&query).unwrap();
assert_eq!(found_ids.len(), 4);
assert_eq!(found_ids, [div_id_2, p_id, p_id_2, p_id_3]);
}
}

0 comments on commit 38ac759

Please sign in to comment.