|
@@ -1,5 +1,8 @@
|
|
|
+use std::collections::HashSet;
|
|
|
+
|
|
|
use dioxus::dioxus_core::{ElementId, Mutation::*};
|
|
|
use dioxus::prelude::*;
|
|
|
+use dioxus_core::Mutation;
|
|
|
use pretty_assertions::assert_eq;
|
|
|
|
|
|
#[test]
|
|
@@ -18,10 +21,11 @@ fn list_creates_one_by_one() {
|
|
|
|
|
|
// load the div and then assign the empty fragment as a placeholder
|
|
|
assert_eq!(
|
|
|
- dom.rebuild_to_vec().sanitize().edits,
|
|
|
+ dom.rebuild_to_vec().edits,
|
|
|
[
|
|
|
- LoadTemplate { name: "template", index: 0, id: ElementId(1,) },
|
|
|
- AssignId { path: &[0], id: ElementId(2,) },
|
|
|
+ LoadTemplate { index: 0, id: ElementId(1,) },
|
|
|
+ CreatePlaceholder { id: ElementId(2,) },
|
|
|
+ ReplacePlaceholder { path: &[0], m: 1 },
|
|
|
AppendChildren { id: ElementId(0), m: 1 },
|
|
|
]
|
|
|
);
|
|
@@ -29,10 +33,11 @@ fn list_creates_one_by_one() {
|
|
|
// Rendering the first item should replace the placeholder with an element
|
|
|
dom.mark_dirty(ScopeId::APP);
|
|
|
assert_eq!(
|
|
|
- dom.render_immediate_to_vec().sanitize().edits,
|
|
|
+ dom.render_immediate_to_vec().edits,
|
|
|
[
|
|
|
- LoadTemplate { name: "template", index: 0, id: ElementId(3,) },
|
|
|
- HydrateText { path: &[0], value: "0".to_string(), id: ElementId(4,) },
|
|
|
+ LoadTemplate { index: 0, id: ElementId(3,) },
|
|
|
+ CreateTextNode { value: "0".to_string(), id: ElementId(4,) },
|
|
|
+ ReplacePlaceholder { path: &[0], m: 1 },
|
|
|
ReplaceWith { id: ElementId(2,), m: 1 },
|
|
|
]
|
|
|
);
|
|
@@ -40,10 +45,11 @@ fn list_creates_one_by_one() {
|
|
|
// Rendering the next item should insert after the previous
|
|
|
dom.mark_dirty(ScopeId::APP);
|
|
|
assert_eq!(
|
|
|
- dom.render_immediate_to_vec().sanitize().edits,
|
|
|
+ dom.render_immediate_to_vec().edits,
|
|
|
[
|
|
|
- LoadTemplate { name: "template", index: 0, id: ElementId(2,) },
|
|
|
- HydrateText { path: &[0], value: "1".to_string(), id: ElementId(5,) },
|
|
|
+ LoadTemplate { index: 0, id: ElementId(2,) },
|
|
|
+ CreateTextNode { value: "1".to_string(), id: ElementId(5,) },
|
|
|
+ ReplacePlaceholder { path: &[0], m: 1 },
|
|
|
InsertAfter { id: ElementId(3,), m: 1 },
|
|
|
]
|
|
|
);
|
|
@@ -51,10 +57,11 @@ fn list_creates_one_by_one() {
|
|
|
// ... and again!
|
|
|
dom.mark_dirty(ScopeId::APP);
|
|
|
assert_eq!(
|
|
|
- dom.render_immediate_to_vec().sanitize().edits,
|
|
|
+ dom.render_immediate_to_vec().edits,
|
|
|
[
|
|
|
- LoadTemplate { name: "template", index: 0, id: ElementId(6,) },
|
|
|
- HydrateText { path: &[0], value: "2".to_string(), id: ElementId(7,) },
|
|
|
+ LoadTemplate { index: 0, id: ElementId(6,) },
|
|
|
+ CreateTextNode { value: "2".to_string(), id: ElementId(7,) },
|
|
|
+ ReplacePlaceholder { path: &[0], m: 1 },
|
|
|
InsertAfter { id: ElementId(2,), m: 1 },
|
|
|
]
|
|
|
);
|
|
@@ -62,10 +69,11 @@ fn list_creates_one_by_one() {
|
|
|
// once more
|
|
|
dom.mark_dirty(ScopeId::APP);
|
|
|
assert_eq!(
|
|
|
- dom.render_immediate_to_vec().sanitize().edits,
|
|
|
+ dom.render_immediate_to_vec().edits,
|
|
|
[
|
|
|
- LoadTemplate { name: "template", index: 0, id: ElementId(8,) },
|
|
|
- HydrateText { path: &[0], value: "3".to_string(), id: ElementId(9,) },
|
|
|
+ LoadTemplate { index: 0, id: ElementId(8,) },
|
|
|
+ CreateTextNode { value: "3".to_string(), id: ElementId(9,) },
|
|
|
+ ReplacePlaceholder { path: &[0], m: 1 },
|
|
|
InsertAfter { id: ElementId(6,), m: 1 },
|
|
|
]
|
|
|
);
|
|
@@ -87,17 +95,20 @@ fn removes_one_by_one() {
|
|
|
|
|
|
// load the div and then assign the empty fragment as a placeholder
|
|
|
assert_eq!(
|
|
|
- dom.rebuild_to_vec().sanitize().edits,
|
|
|
+ dom.rebuild_to_vec().edits,
|
|
|
[
|
|
|
// The container
|
|
|
- LoadTemplate { name: "template", index: 0, id: ElementId(1) },
|
|
|
+ LoadTemplate { index: 0, id: ElementId(1) },
|
|
|
// each list item
|
|
|
- LoadTemplate { name: "template", index: 0, id: ElementId(2) },
|
|
|
- HydrateText { path: &[0], value: "0".to_string(), id: ElementId(3) },
|
|
|
- LoadTemplate { name: "template", index: 0, id: ElementId(4) },
|
|
|
- HydrateText { path: &[0], value: "1".to_string(), id: ElementId(5) },
|
|
|
- LoadTemplate { name: "template", index: 0, id: ElementId(6) },
|
|
|
- HydrateText { path: &[0], value: "2".to_string(), id: ElementId(7) },
|
|
|
+ LoadTemplate { index: 0, id: ElementId(2) },
|
|
|
+ CreateTextNode { value: "0".to_string(), id: ElementId(3) },
|
|
|
+ ReplacePlaceholder { path: &[0], m: 1 },
|
|
|
+ LoadTemplate { index: 0, id: ElementId(4) },
|
|
|
+ CreateTextNode { value: "1".to_string(), id: ElementId(5) },
|
|
|
+ ReplacePlaceholder { path: &[0], m: 1 },
|
|
|
+ LoadTemplate { index: 0, id: ElementId(6) },
|
|
|
+ CreateTextNode { value: "2".to_string(), id: ElementId(7) },
|
|
|
+ ReplacePlaceholder { path: &[0], m: 1 },
|
|
|
// replace the placeholder in the template with the 3 templates on the stack
|
|
|
ReplacePlaceholder { m: 3, path: &[0] },
|
|
|
// Mount the div
|
|
@@ -109,14 +120,14 @@ fn removes_one_by_one() {
|
|
|
// Rendering the first item should replace the placeholder with an element
|
|
|
dom.mark_dirty(ScopeId::APP);
|
|
|
assert_eq!(
|
|
|
- dom.render_immediate_to_vec().sanitize().edits,
|
|
|
+ dom.render_immediate_to_vec().edits,
|
|
|
[Remove { id: ElementId(6) }]
|
|
|
);
|
|
|
|
|
|
// Remove div(2)
|
|
|
dom.mark_dirty(ScopeId::APP);
|
|
|
assert_eq!(
|
|
|
- dom.render_immediate_to_vec().sanitize().edits,
|
|
|
+ dom.render_immediate_to_vec().edits,
|
|
|
[Remove { id: ElementId(4) }]
|
|
|
);
|
|
|
|
|
@@ -124,7 +135,7 @@ fn removes_one_by_one() {
|
|
|
// todo: this should just be a remove with no placeholder
|
|
|
dom.mark_dirty(ScopeId::APP);
|
|
|
assert_eq!(
|
|
|
- dom.render_immediate_to_vec().sanitize().edits,
|
|
|
+ dom.render_immediate_to_vec().edits,
|
|
|
[
|
|
|
CreatePlaceholder { id: ElementId(4) },
|
|
|
ReplaceWith { id: ElementId(2), m: 1 }
|
|
@@ -135,14 +146,17 @@ fn removes_one_by_one() {
|
|
|
// todo: this should actually be append to, but replace placeholder is fine for now
|
|
|
dom.mark_dirty(ScopeId::APP);
|
|
|
assert_eq!(
|
|
|
- dom.render_immediate_to_vec().sanitize().edits,
|
|
|
+ dom.render_immediate_to_vec().edits,
|
|
|
[
|
|
|
- LoadTemplate { name: "template", index: 0, id: ElementId(2) },
|
|
|
- HydrateText { path: &[0], value: "0".to_string(), id: ElementId(6) },
|
|
|
- LoadTemplate { name: "template", index: 0, id: ElementId(8) },
|
|
|
- HydrateText { path: &[0], value: "1".to_string(), id: ElementId(9) },
|
|
|
- LoadTemplate { name: "template", index: 0, id: ElementId(10) },
|
|
|
- HydrateText { path: &[0], value: "2".to_string(), id: ElementId(11) },
|
|
|
+ LoadTemplate { index: 0, id: ElementId(2) },
|
|
|
+ CreateTextNode { value: "0".to_string(), id: ElementId(6) },
|
|
|
+ ReplacePlaceholder { path: &[0], m: 1 },
|
|
|
+ LoadTemplate { index: 0, id: ElementId(8) },
|
|
|
+ CreateTextNode { value: "1".to_string(), id: ElementId(9) },
|
|
|
+ ReplacePlaceholder { path: &[0], m: 1 },
|
|
|
+ LoadTemplate { index: 0, id: ElementId(10) },
|
|
|
+ CreateTextNode { value: "2".to_string(), id: ElementId(11) },
|
|
|
+ ReplacePlaceholder { path: &[0], m: 1 },
|
|
|
ReplaceWith { id: ElementId(4), m: 3 }
|
|
|
]
|
|
|
);
|
|
@@ -162,46 +176,53 @@ fn list_shrink_multiroot() {
|
|
|
});
|
|
|
|
|
|
assert_eq!(
|
|
|
- dom.rebuild_to_vec().sanitize().edits,
|
|
|
+ dom.rebuild_to_vec().edits,
|
|
|
[
|
|
|
- LoadTemplate { name: "template", index: 0, id: ElementId(1,) },
|
|
|
- AssignId { path: &[0,], id: ElementId(2,) },
|
|
|
+ LoadTemplate { index: 0, id: ElementId(1,) },
|
|
|
+ CreatePlaceholder { id: ElementId(2,) },
|
|
|
+ ReplacePlaceholder { path: &[0,], m: 1 },
|
|
|
AppendChildren { id: ElementId(0), m: 1 }
|
|
|
]
|
|
|
);
|
|
|
|
|
|
dom.mark_dirty(ScopeId::APP);
|
|
|
assert_eq!(
|
|
|
- dom.render_immediate_to_vec().sanitize().edits,
|
|
|
+ dom.render_immediate_to_vec().edits,
|
|
|
[
|
|
|
- LoadTemplate { name: "template", index: 0, id: ElementId(3) },
|
|
|
- HydrateText { path: &[0], value: "0".to_string(), id: ElementId(4) },
|
|
|
- LoadTemplate { name: "template", index: 1, id: ElementId(5) },
|
|
|
- HydrateText { path: &[0], value: "0".to_string(), id: ElementId(6) },
|
|
|
+ LoadTemplate { index: 0, id: ElementId(3) },
|
|
|
+ CreateTextNode { value: "0".to_string(), id: ElementId(4) },
|
|
|
+ ReplacePlaceholder { path: &[0], m: 1 },
|
|
|
+ LoadTemplate { index: 1, id: ElementId(5) },
|
|
|
+ CreateTextNode { value: "0".to_string(), id: ElementId(6) },
|
|
|
+ ReplacePlaceholder { path: &[0], m: 1 },
|
|
|
ReplaceWith { id: ElementId(2), m: 2 }
|
|
|
]
|
|
|
);
|
|
|
|
|
|
dom.mark_dirty(ScopeId::APP);
|
|
|
assert_eq!(
|
|
|
- dom.render_immediate_to_vec().sanitize().edits,
|
|
|
+ dom.render_immediate_to_vec().edits,
|
|
|
[
|
|
|
- LoadTemplate { name: "template", index: 0, id: ElementId(2) },
|
|
|
- HydrateText { path: &[0], value: "1".to_string(), id: ElementId(7) },
|
|
|
- LoadTemplate { name: "template", index: 1, id: ElementId(8) },
|
|
|
- HydrateText { path: &[0], value: "1".to_string(), id: ElementId(9) },
|
|
|
+ LoadTemplate { index: 0, id: ElementId(2) },
|
|
|
+ CreateTextNode { value: "1".to_string(), id: ElementId(7) },
|
|
|
+ ReplacePlaceholder { path: &[0], m: 1 },
|
|
|
+ LoadTemplate { index: 1, id: ElementId(8) },
|
|
|
+ CreateTextNode { value: "1".to_string(), id: ElementId(9) },
|
|
|
+ ReplacePlaceholder { path: &[0], m: 1 },
|
|
|
InsertAfter { id: ElementId(5), m: 2 }
|
|
|
]
|
|
|
);
|
|
|
|
|
|
dom.mark_dirty(ScopeId::APP);
|
|
|
assert_eq!(
|
|
|
- dom.render_immediate_to_vec().sanitize().edits,
|
|
|
+ dom.render_immediate_to_vec().edits,
|
|
|
[
|
|
|
- LoadTemplate { name: "template", index: 0, id: ElementId(10) },
|
|
|
- HydrateText { path: &[0], value: "2".to_string(), id: ElementId(11) },
|
|
|
- LoadTemplate { name: "template", index: 1, id: ElementId(12) },
|
|
|
- HydrateText { path: &[0], value: "2".to_string(), id: ElementId(13) },
|
|
|
+ LoadTemplate { index: 0, id: ElementId(10) },
|
|
|
+ CreateTextNode { value: "2".to_string(), id: ElementId(11) },
|
|
|
+ ReplacePlaceholder { path: &[0], m: 1 },
|
|
|
+ LoadTemplate { index: 1, id: ElementId(12) },
|
|
|
+ CreateTextNode { value: "2".to_string(), id: ElementId(13) },
|
|
|
+ ReplacePlaceholder { path: &[0], m: 1 },
|
|
|
InsertAfter { id: ElementId(8), m: 2 }
|
|
|
]
|
|
|
);
|
|
@@ -224,46 +245,48 @@ fn removes_one_by_one_multiroot() {
|
|
|
|
|
|
// load the div and then assign the empty fragment as a placeholder
|
|
|
assert_eq!(
|
|
|
- dom.rebuild_to_vec().sanitize().edits,
|
|
|
+ dom.rebuild_to_vec().edits,
|
|
|
[
|
|
|
- LoadTemplate { name: "template", index: 0, id: ElementId(1) },
|
|
|
- //
|
|
|
- LoadTemplate { name: "template", index: 0, id: ElementId(2) },
|
|
|
- HydrateText { path: &[0], value: "0".to_string(), id: ElementId(3) },
|
|
|
- LoadTemplate { name: "template", index: 1, id: ElementId(4) },
|
|
|
- HydrateText { path: &[0], value: "0".to_string(), id: ElementId(5) },
|
|
|
- //
|
|
|
- LoadTemplate { name: "template", index: 0, id: ElementId(6) },
|
|
|
- HydrateText { path: &[0], value: "1".to_string(), id: ElementId(7) },
|
|
|
- LoadTemplate { name: "template", index: 1, id: ElementId(8) },
|
|
|
- HydrateText { path: &[0], value: "1".to_string(), id: ElementId(9) },
|
|
|
- //
|
|
|
- LoadTemplate { name: "template", index: 0, id: ElementId(10) },
|
|
|
- HydrateText { path: &[0], value: "2".to_string(), id: ElementId(11) },
|
|
|
- LoadTemplate { name: "template", index: 1, id: ElementId(12) },
|
|
|
- HydrateText { path: &[0], value: "2".to_string(), id: ElementId(13) },
|
|
|
+ LoadTemplate { index: 0, id: ElementId(1) },
|
|
|
//
|
|
|
+ LoadTemplate { index: 0, id: ElementId(2) },
|
|
|
+ CreateTextNode { value: "0".to_string(), id: ElementId(3) },
|
|
|
+ ReplacePlaceholder { path: &[0], m: 1 },
|
|
|
+ LoadTemplate { index: 1, id: ElementId(4) },
|
|
|
+ CreateTextNode { value: "0".to_string(), id: ElementId(5) },
|
|
|
+ ReplacePlaceholder { path: &[0], m: 1 },
|
|
|
+ LoadTemplate { index: 0, id: ElementId(6) },
|
|
|
+ CreateTextNode { value: "1".to_string(), id: ElementId(7) },
|
|
|
+ ReplacePlaceholder { path: &[0], m: 1 },
|
|
|
+ LoadTemplate { index: 1, id: ElementId(8) },
|
|
|
+ CreateTextNode { value: "1".to_string(), id: ElementId(9) },
|
|
|
+ ReplacePlaceholder { path: &[0], m: 1 },
|
|
|
+ LoadTemplate { index: 0, id: ElementId(10) },
|
|
|
+ CreateTextNode { value: "2".to_string(), id: ElementId(11) },
|
|
|
+ ReplacePlaceholder { path: &[0], m: 1 },
|
|
|
+ LoadTemplate { index: 1, id: ElementId(12) },
|
|
|
+ CreateTextNode { value: "2".to_string(), id: ElementId(13) },
|
|
|
+ ReplacePlaceholder { path: &[0], m: 1 },
|
|
|
ReplacePlaceholder { path: &[0], m: 6 },
|
|
|
- //
|
|
|
AppendChildren { id: ElementId(0), m: 1 }
|
|
|
]
|
|
|
);
|
|
|
|
|
|
dom.mark_dirty(ScopeId::APP);
|
|
|
assert_eq!(
|
|
|
- dom.render_immediate_to_vec().sanitize().edits,
|
|
|
+ dom.render_immediate_to_vec().edits,
|
|
|
[Remove { id: ElementId(10) }, Remove { id: ElementId(12) }]
|
|
|
);
|
|
|
|
|
|
dom.mark_dirty(ScopeId::APP);
|
|
|
assert_eq!(
|
|
|
- dom.render_immediate_to_vec().sanitize().edits,
|
|
|
+ dom.render_immediate_to_vec().edits,
|
|
|
[Remove { id: ElementId(6) }, Remove { id: ElementId(8) }]
|
|
|
);
|
|
|
|
|
|
dom.mark_dirty(ScopeId::APP);
|
|
|
assert_eq!(
|
|
|
- dom.render_immediate_to_vec().sanitize().edits,
|
|
|
+ dom.render_immediate_to_vec().edits,
|
|
|
[
|
|
|
CreatePlaceholder { id: ElementId(8) },
|
|
|
Remove { id: ElementId(2) },
|
|
@@ -317,9 +340,9 @@ fn remove_many() {
|
|
|
}
|
|
|
});
|
|
|
|
|
|
+ // len = 0
|
|
|
{
|
|
|
- let edits = dom.rebuild_to_vec().sanitize();
|
|
|
- assert!(edits.templates.is_empty());
|
|
|
+ let edits = dom.rebuild_to_vec();
|
|
|
assert_eq!(
|
|
|
edits.edits,
|
|
|
[
|
|
@@ -329,62 +352,76 @@ fn remove_many() {
|
|
|
);
|
|
|
}
|
|
|
|
|
|
+ // len = 1
|
|
|
{
|
|
|
dom.mark_dirty(ScopeId::APP);
|
|
|
- let edits = dom.render_immediate_to_vec().sanitize();
|
|
|
+ let edits = dom.render_immediate_to_vec();
|
|
|
assert_eq!(
|
|
|
edits.edits,
|
|
|
[
|
|
|
- LoadTemplate { name: "template", index: 0, id: ElementId(2,) },
|
|
|
- HydrateText { path: &[0,], value: "hello 0".to_string(), id: ElementId(3,) },
|
|
|
+ LoadTemplate { index: 0, id: ElementId(2,) },
|
|
|
+ CreateTextNode { value: "hello 0".to_string(), id: ElementId(3,) },
|
|
|
+ ReplacePlaceholder { path: &[0,], m: 1 },
|
|
|
ReplaceWith { id: ElementId(1,), m: 1 },
|
|
|
]
|
|
|
);
|
|
|
}
|
|
|
|
|
|
+ // len = 5
|
|
|
{
|
|
|
dom.mark_dirty(ScopeId::APP);
|
|
|
- let edits = dom.render_immediate_to_vec().sanitize();
|
|
|
+ let edits = dom.render_immediate_to_vec();
|
|
|
assert_eq!(
|
|
|
edits.edits,
|
|
|
[
|
|
|
- LoadTemplate { name: "template", index: 0, id: ElementId(1,) },
|
|
|
- HydrateText { path: &[0,], value: "hello 1".to_string(), id: ElementId(4,) },
|
|
|
- LoadTemplate { name: "template", index: 0, id: ElementId(5,) },
|
|
|
- HydrateText { path: &[0,], value: "hello 2".to_string(), id: ElementId(6,) },
|
|
|
- LoadTemplate { name: "template", index: 0, id: ElementId(7,) },
|
|
|
- HydrateText { path: &[0,], value: "hello 3".to_string(), id: ElementId(8,) },
|
|
|
- LoadTemplate { name: "template", index: 0, id: ElementId(9,) },
|
|
|
- HydrateText { path: &[0,], value: "hello 4".to_string(), id: ElementId(10,) },
|
|
|
+ LoadTemplate { index: 0, id: ElementId(1,) },
|
|
|
+ CreateTextNode { value: "hello 1".to_string(), id: ElementId(4,) },
|
|
|
+ ReplacePlaceholder { path: &[0,], m: 1 },
|
|
|
+ LoadTemplate { index: 0, id: ElementId(5,) },
|
|
|
+ CreateTextNode { value: "hello 2".to_string(), id: ElementId(6,) },
|
|
|
+ ReplacePlaceholder { path: &[0,], m: 1 },
|
|
|
+ LoadTemplate { index: 0, id: ElementId(7,) },
|
|
|
+ CreateTextNode { value: "hello 3".to_string(), id: ElementId(8,) },
|
|
|
+ ReplacePlaceholder { path: &[0,], m: 1 },
|
|
|
+ LoadTemplate { index: 0, id: ElementId(9,) },
|
|
|
+ CreateTextNode { value: "hello 4".to_string(), id: ElementId(10,) },
|
|
|
+ ReplacePlaceholder { path: &[0,], m: 1 },
|
|
|
InsertAfter { id: ElementId(2,), m: 4 },
|
|
|
]
|
|
|
);
|
|
|
}
|
|
|
|
|
|
+ // len = 0
|
|
|
{
|
|
|
dom.mark_dirty(ScopeId::APP);
|
|
|
- let edits = dom.render_immediate_to_vec().sanitize();
|
|
|
+ let edits = dom.render_immediate_to_vec();
|
|
|
+ assert_eq!(edits.edits[0], CreatePlaceholder { id: ElementId(11,) });
|
|
|
+ let removed = edits.edits[1..5]
|
|
|
+ .iter()
|
|
|
+ .map(|edit| match edit {
|
|
|
+ Mutation::Remove { id } => *id,
|
|
|
+ _ => panic!("Expected remove"),
|
|
|
+ })
|
|
|
+ .collect::<HashSet<_>>();
|
|
|
assert_eq!(
|
|
|
- edits.edits,
|
|
|
- [
|
|
|
- CreatePlaceholder { id: ElementId(11,) },
|
|
|
- Remove { id: ElementId(9,) },
|
|
|
- Remove { id: ElementId(7,) },
|
|
|
- Remove { id: ElementId(5,) },
|
|
|
- Remove { id: ElementId(1,) },
|
|
|
- ReplaceWith { id: ElementId(2,), m: 1 },
|
|
|
- ]
|
|
|
+ removed,
|
|
|
+ [ElementId(7), ElementId(5), ElementId(2), ElementId(1)]
|
|
|
+ .into_iter()
|
|
|
+ .collect::<HashSet<_>>()
|
|
|
);
|
|
|
+ assert_eq!(edits.edits[5..], [ReplaceWith { id: ElementId(9,), m: 1 },]);
|
|
|
}
|
|
|
|
|
|
+ // len = 1
|
|
|
{
|
|
|
dom.mark_dirty(ScopeId::APP);
|
|
|
- let edits = dom.render_immediate_to_vec().sanitize();
|
|
|
+ let edits = dom.render_immediate_to_vec();
|
|
|
assert_eq!(
|
|
|
edits.edits,
|
|
|
[
|
|
|
- LoadTemplate { name: "template", index: 0, id: ElementId(2,) },
|
|
|
- HydrateText { path: &[0,], value: "hello 0".to_string(), id: ElementId(1,) },
|
|
|
+ LoadTemplate { index: 0, id: ElementId(9,) },
|
|
|
+ CreateTextNode { value: "hello 0".to_string(), id: ElementId(7,) },
|
|
|
+ ReplacePlaceholder { path: &[0,], m: 1 },
|
|
|
ReplaceWith { id: ElementId(11,), m: 1 },
|
|
|
]
|
|
|
)
|
|
@@ -415,12 +452,13 @@ fn replace_and_add_items() {
|
|
|
|
|
|
// The list starts empty with a placeholder
|
|
|
{
|
|
|
- let edits = dom.rebuild_to_vec().sanitize();
|
|
|
+ let edits = dom.rebuild_to_vec();
|
|
|
assert_eq!(
|
|
|
edits.edits,
|
|
|
[
|
|
|
- LoadTemplate { name: "template", index: 0, id: ElementId(1,) },
|
|
|
- AssignId { path: &[0], id: ElementId(2,) },
|
|
|
+ LoadTemplate { index: 0, id: ElementId(1,) },
|
|
|
+ CreatePlaceholder { id: ElementId(2,) },
|
|
|
+ ReplacePlaceholder { path: &[0], m: 1 },
|
|
|
AppendChildren { id: ElementId(0), m: 1 },
|
|
|
]
|
|
|
);
|
|
@@ -429,11 +467,11 @@ fn replace_and_add_items() {
|
|
|
// Rerendering adds an a static template
|
|
|
{
|
|
|
dom.mark_dirty(ScopeId::APP);
|
|
|
- let edits = dom.render_immediate_to_vec().sanitize();
|
|
|
+ let edits = dom.render_immediate_to_vec();
|
|
|
assert_eq!(
|
|
|
edits.edits,
|
|
|
[
|
|
|
- LoadTemplate { name: "template", index: 0, id: ElementId(3,) },
|
|
|
+ LoadTemplate { index: 0, id: ElementId(3,) },
|
|
|
ReplaceWith { id: ElementId(2,), m: 1 },
|
|
|
]
|
|
|
);
|
|
@@ -442,7 +480,7 @@ fn replace_and_add_items() {
|
|
|
// Rerendering replaces the old node with a placeholder and adds a new placeholder
|
|
|
{
|
|
|
dom.mark_dirty(ScopeId::APP);
|
|
|
- let edits = dom.render_immediate_to_vec().sanitize();
|
|
|
+ let edits = dom.render_immediate_to_vec();
|
|
|
assert_eq!(
|
|
|
edits.edits,
|
|
|
[
|
|
@@ -457,15 +495,15 @@ fn replace_and_add_items() {
|
|
|
// Rerendering replaces both placeholders with the static nodes and add a new static node
|
|
|
{
|
|
|
dom.mark_dirty(ScopeId::APP);
|
|
|
- let edits = dom.render_immediate_to_vec().sanitize();
|
|
|
+ let edits = dom.render_immediate_to_vec();
|
|
|
assert_eq!(
|
|
|
edits.edits,
|
|
|
[
|
|
|
- LoadTemplate { name: "template", index: 0, id: ElementId(3,) },
|
|
|
+ LoadTemplate { index: 0, id: ElementId(3,) },
|
|
|
InsertAfter { id: ElementId(2,), m: 1 },
|
|
|
- LoadTemplate { name: "template", index: 0, id: ElementId(5,) },
|
|
|
+ LoadTemplate { index: 0, id: ElementId(5,) },
|
|
|
ReplaceWith { id: ElementId(4,), m: 1 },
|
|
|
- LoadTemplate { name: "template", index: 0, id: ElementId(4,) },
|
|
|
+ LoadTemplate { index: 0, id: ElementId(4,) },
|
|
|
ReplaceWith { id: ElementId(2,), m: 1 },
|
|
|
]
|
|
|
);
|