use azul_core::dom::Dom;
use azul_css::css::Css;
fn empty_css() -> Css {
Css::empty()
}
#[test]
fn test_append_single_child() {
let parent = Dom::create_div()
.with_child(Dom::create_text("existing"))
.style(empty_css());
let initial_len = parent.node_hierarchy.as_ref().len();
let child = Dom::create_text("appended").style(empty_css());
let child_len = child.node_hierarchy.as_ref().len();
let mut combined = parent;
combined.append_child(child);
assert_eq!(
combined.node_hierarchy.as_ref().len(),
initial_len + child_len,
"Combined length should be parent + child"
);
}
#[test]
fn test_append_multiple_children() {
let mut parent = Dom::create_div().style(empty_css());
parent.append_child(Dom::create_text("first").style(empty_css()));
parent.append_child(Dom::create_text("second").style(empty_css()));
parent.append_child(Dom::create_text("third").style(empty_css()));
assert_eq!(parent.node_hierarchy.as_ref().len(), 4);
}
#[test]
fn test_append_nested_child() {
let parent = Dom::create_div().style(empty_css());
let nested = Dom::create_div()
.with_child(Dom::create_div().with_child(Dom::create_text("deeply nested")))
.style(empty_css());
let mut combined = parent;
combined.append_child(nested);
for (i, node) in combined.node_hierarchy.as_ref().iter().enumerate() {
if let Some(parent_id) = node.parent_id() {
assert!(
parent_id.index() < combined.node_hierarchy.as_ref().len(),
"Node {} has invalid parent index {} (len={})",
i,
parent_id.index(),
combined.node_hierarchy.as_ref().len()
);
}
if let Some(last_child_id) = node.last_child_id() {
assert!(
last_child_id.index() < combined.node_hierarchy.as_ref().len(),
"Node {} has invalid last_child index {} (len={})",
i,
last_child_id.index(),
combined.node_hierarchy.as_ref().len()
);
}
if let Some(prev_id) = node.previous_sibling_id() {
assert!(
prev_id.index() < combined.node_hierarchy.as_ref().len(),
"Node {} has invalid previous_sibling index {} (len={})",
i,
prev_id.index(),
combined.node_hierarchy.as_ref().len()
);
}
if let Some(next_id) = node.next_sibling_id() {
assert!(
next_id.index() < combined.node_hierarchy.as_ref().len(),
"Node {} has invalid next_sibling index {} (len={})",
i,
next_id.index(),
combined.node_hierarchy.as_ref().len()
);
}
}
}
#[test]
fn test_no_underflow_on_empty_parent() {
let parent = Dom::create_div().style(empty_css());
let child = Dom::create_text("child").style(empty_css());
let mut combined = parent;
combined.append_child(child);
for (i, node) in combined.node_hierarchy.as_ref().iter().enumerate() {
if let Some(last_child_id) = node.last_child_id() {
assert!(
last_child_id.index() < combined.node_hierarchy.as_ref().len(),
"Node {} last_child underflow: index {} >= len {}",
i,
last_child_id.index(),
combined.node_hierarchy.as_ref().len()
);
}
}
}
#[test]
fn test_hierarchy_fields_use_one_based_encoding() {
let parent = Dom::create_div()
.with_child(Dom::create_text("child"))
.style(empty_css());
let root = parent.root.into_crate_internal().expect("should have root");
let root_node = &parent.node_hierarchy.as_ref()[root.index()];
assert!(
root_node.last_child != 0,
"Root with children should have last_child != 0"
);
if let Some(child_id) = root_node.last_child_id() {
let child_node = &parent.node_hierarchy.as_ref()[child_id.index()];
assert!(child_node.parent != 0, "Child should have parent != 0");
}
}
#[test]
fn test_none_fields_are_zero() {
let leaf = Dom::create_text("leaf").style(empty_css());
let root = leaf.root.into_crate_internal().expect("should have root");
let root_node = &leaf.node_hierarchy.as_ref()[root.index()];
assert_eq!(
root_node.last_child, 0,
"Leaf node should have last_child = 0 (None)"
);
assert_eq!(
root_node.parent, 0,
"Root node should have parent = 0 (None)"
);
}
#[test]
fn test_regression_index_2_with_len_2() {
let parent = Dom::create_div()
.with_child(Dom::create_text("child"))
.style(empty_css());
assert_eq!(parent.node_hierarchy.as_ref().len(), 2);
let child2 = Dom::create_text("child2").style(empty_css());
let mut combined = parent;
combined.append_child(child2);
assert_eq!(combined.node_hierarchy.as_ref().len(), 3);
for (i, node) in combined.node_hierarchy.as_ref().iter().enumerate() {
if let Some(lc) = node.last_child_id() {
assert!(
lc.index() < combined.node_hierarchy.as_ref().len(),
"BUG REGRESSION: Node {} has last_child index {} but len is {}",
i,
lc.index(),
combined.node_hierarchy.as_ref().len()
);
}
}
}
#[test]
fn test_xml_like_append_sequence() {
let mut body = Dom::create_body().style(empty_css());
for i in 0..5 {
let child = Dom::create_div()
.with_child(Dom::create_text(format!("text {}", i)))
.style(empty_css());
body.append_child(child);
}
let len = body.node_hierarchy.as_ref().len();
for (i, node) in body.node_hierarchy.as_ref().iter().enumerate() {
if let Some(id) = node.parent_id() {
assert!(id.index() < len, "Node {} parent invalid", i);
}
if let Some(id) = node.last_child_id() {
assert!(id.index() < len, "Node {} last_child invalid", i);
}
if let Some(id) = node.previous_sibling_id() {
assert!(id.index() < len, "Node {} previous_sibling invalid", i);
}
if let Some(id) = node.next_sibling_id() {
assert!(id.index() < len, "Node {} next_sibling invalid", i);
}
}
}