was \
+ destroyed by Vec flattening)",
+ first.node_name(),
+ );
+ }
+
+ #[test]
+ fn option_expression_preserves_sibling_identity() {
+ let document = gloo::utils::document();
+ let scope: AnyScope = AnyScope::test();
+ let parent = document.create_element("div").unwrap();
+ let root = BSubtree::create_root(&parent);
+ let end = document.create_text_node("END");
+ parent.append_child(&end).unwrap();
+ let slot = DomSlot::at(end.into());
+
+ let maybe: Option = None;
+ let vnode = html! { <>
{maybe}> };
+ let mut bundle = Bundle::new();
+ bundle.reconcile(&root, &scope, &parent, slot.clone(), vnode);
+ scheduler::start_now();
+ assert_eq!(parent.inner_html(), r#"
END"#);
+
+ let div_node = parent.first_child().expect("should have a child");
+ assert_eq!(div_node.node_name(), "DIV");
+
+ let maybe: Option = Some(html! {
});
+ let vnode = html! { <>
{maybe}> };
+ bundle.reconcile(&root, &scope, &parent, slot.clone(), vnode);
+ scheduler::start_now();
+ assert_eq!(
+ parent.inner_html(),
+ r#"
END"#
+ );
+
+ let first = parent.first_child().expect("should have children");
+ assert!(
+ first.is_same_node(Some(&div_node)),
+ "the
DOM node should be reused, not recreated (got <{}>, the old
was \
+ destroyed by Option flattening)",
+ first.node_name(),
+ );
+ }
+
+ #[test]
+ fn unkeyed_grow_preserves_leading_nodes() {
+ let document = gloo::utils::document();
+ let scope: AnyScope = AnyScope::test();
+ let parent = document.create_element("div").unwrap();
+ let root = BSubtree::create_root(&parent);
+ let end = document.create_text_node("END");
+ parent.append_child(&end).unwrap();
+ let slot = DomSlot::at(end.into());
+
+ let vnode = html! { <>
> };
+ let mut bundle = Bundle::new();
+ bundle.reconcile(&root, &scope, &parent, slot.clone(), vnode);
+ scheduler::start_now();
+ assert_eq!(parent.inner_html(), "
END");
+
+ let div_node = parent.first_child().unwrap();
+ assert_eq!(div_node.node_name(), "DIV");
+ let span_node = div_node.next_sibling().unwrap();
+ assert_eq!(span_node.node_name(), "SPAN");
+
+ let vnode = html! { <>
> };
+ bundle.reconcile(&root, &scope, &parent, slot.clone(), vnode);
+ scheduler::start_now();
+ assert_eq!(parent.inner_html(), "
END");
+
+ let first = parent.first_child().unwrap();
+ assert!(
+ first.is_same_node(Some(&div_node)),
+ "growing a list should not recreate leading
",
+ );
+ let second = first.next_sibling().unwrap();
+ assert!(
+ second.is_same_node(Some(&span_node)),
+ "growing a list should not recreate leading
",
+ );
+ }
+
+ #[test]
+ fn unkeyed_shrink_preserves_leading_nodes() {
+ let document = gloo::utils::document();
+ let scope: AnyScope = AnyScope::test();
+ let parent = document.create_element("div").unwrap();
+ let root = BSubtree::create_root(&parent);
+ let end = document.create_text_node("END");
+ parent.append_child(&end).unwrap();
+ let slot = DomSlot::at(end.into());
+
+ let vnode = html! { <>> };
+ let mut bundle = Bundle::new();
+ bundle.reconcile(&root, &scope, &parent, slot.clone(), vnode);
+ scheduler::start_now();
+ assert_eq!(parent.inner_html(), "END");
+
+ let div_node = parent.first_child().unwrap();
+ let span_node = div_node.next_sibling().unwrap();
+
+ let vnode = html! { <>> };
+ bundle.reconcile(&root, &scope, &parent, slot.clone(), vnode);
+ scheduler::start_now();
+ assert_eq!(parent.inner_html(), "END");
+
+ let first = parent.first_child().unwrap();
+ assert!(
+ first.is_same_node(Some(&div_node)),
+ "shrinking a list should not recreate leading ",
+ );
+ let second = first.next_sibling().unwrap();
+ assert!(
+ second.is_same_node(Some(&span_node)),
+ "shrinking a list should not recreate leading
",
+ );
+ }
+
+ #[test]
+ fn keyed_prepend_preserves_trailing_nodes() {
+ let document = gloo::utils::document();
+ let scope: AnyScope = AnyScope::test();
+ let parent = document.create_element("div").unwrap();
+ let root = BSubtree::create_root(&parent);
+ let end = document.create_text_node("END");
+ parent.append_child(&end).unwrap();
+ let slot = DomSlot::at(end.into());
+
+ let vnode = html! { <>> };
+ let mut bundle = Bundle::new();
+ bundle.reconcile(&root, &scope, &parent, slot.clone(), vnode);
+ scheduler::start_now();
+ assert_eq!(parent.inner_html(), "END");
+
+ let i_node = parent.first_child().unwrap();
+ let e_node = i_node.next_sibling().unwrap();
+
+ let vnode = html! { <>> };
+ bundle.reconcile(&root, &scope, &parent, slot.clone(), vnode);
+ scheduler::start_now();
+ assert_eq!(parent.inner_html(), "END");
+
+ let children = parent.child_nodes();
+ let second = children.get(1).unwrap();
+ let third = children.get(2).unwrap();
+ assert!(
+ second.is_same_node(Some(&i_node)),
+ "prepending to a keyed list should preserve trailing ",
+ );
+ assert!(
+ third.is_same_node(Some(&e_node)),
+ "prepending to a keyed list should preserve trailing ",
+ );
+ }
+}
diff --git a/tools/changelog/src/create_log_line.rs b/tools/changelog/src/create_log_line.rs
index e360f9eac3f..194547150be 100644
--- a/tools/changelog/src/create_log_line.rs
+++ b/tools/changelog/src/create_log_line.rs
@@ -88,8 +88,10 @@ pub fn create_log_line(
});
let count = leftovers.count();
if count > 0 {
- println!("Potentially invalidly labeled issue: {issue_id}. Neither A-* (area), documentation nor meta labels found. \
- inspect/re-tag at https://github.com/yewstack/yew/issues/{issue_id}");
+ println!(
+ "Potentially invalidly labeled issue: {issue_id}. Neither A-* (area), documentation nor meta labels found. \
+ inspect/re-tag at https://github.com/yewstack/yew/issues/{issue_id}"
+ );
}
return Ok(None);
}