feat: context api overhaul

This commit is contained in:
Jonathan Kelley committed 2022-12-02 16:24:49 -08:00
1 parent 11a45c8ef0
commit a61daf220d
44 files changed
+812 -621

No files matched your search

+1 -1
View File
@@ -26,7 +26,7 @@ fn attrs_cycle() {
dom.rebuild().santize().edits,
[
LoadTemplate { name: "template", index: 0, id: ElementId(1,) },
AppendChildren { m: 1 },
AppendChildren { m: 1, id: ElementId(0) },
]
);
+1 -1
View File
@@ -9,7 +9,7 @@ fn bool_test() {
[
LoadTemplate { name: "template", index: 0, id: ElementId(1) },
SetBoolAttribute { name: "hidden", value: false, id: ElementId(1,) },
AppendChildren { m: 1 },
AppendChildren { m: 1, id: ElementId(0) },
]
)
}
+1 -1
View File
@@ -16,7 +16,7 @@ fn test_borrowed_state() {
HydrateText { path: &[0,], value: "Hello w1!", id: ElementId(4,) },
ReplacePlaceholder { path: &[1,], m: 1 },
ReplacePlaceholder { path: &[0,], m: 1 },
AppendChildren { m: 1 },
AppendChildren { m: 1, id: ElementId(0) },
]
)
}
+1 -1
View File
@@ -23,7 +23,7 @@ fn state_shares() {
dom.rebuild().santize().edits,
[
CreateTextNode { value: "Value is 0", id: ElementId(1,) },
AppendChildren { m: 1 },
AppendChildren { m: 1, id: ElementId(0) },
]
);
+69 -89
View File
@@ -22,25 +22,13 @@ fn test_original_diff() {
});
let edits = dom.rebuild().santize();
assert_eq!(
edits.templates,
[
// create template
CreateElement { name: "div" },
CreateElement { name: "div" },
CreateStaticText { value: "Hello, world!" },
AppendChildren { m: 1 },
AppendChildren { m: 1 },
SaveTemplate { name: "template", m: 1 },
]
);
assert_eq!(
edits.edits,
[
// add to root
LoadTemplate { name: "template", index: 0, id: ElementId(1) },
AppendChildren { m: 1 }
AppendChildren { m: 1, id: ElementId(0) }
]
)
}
@@ -65,28 +53,31 @@ fn create() {
})
});
let edits = dom.rebuild().santize();
assert_eq!(
edits.templates,
[
// create template
CreateElement { name: "div" },
CreateElement { name: "div" },
CreateStaticText { value: "Hello, world!" },
CreateElement { name: "div" },
CreateElement { name: "div" },
CreateStaticPlaceholder {},
AppendChildren { m: 1 },
AppendChildren { m: 1 },
AppendChildren { m: 2 },
AppendChildren { m: 1 },
SaveTemplate { name: "template", m: 1 },
// The fragment child template
CreateStaticText { value: "hello" },
CreateStaticText { value: "world" },
SaveTemplate { name: "template", m: 2 },
]
);
let _edits = dom.rebuild().santize();
// todo: we don't test template mutations anymore since the templates are passed along
// assert_eq!(
// edits.templates,
// [
// // create template
// CreateElement { name: "div" },
// CreateElement { name: "div" },
// CreateStaticText { value: "Hello, world!" },
// CreateElement { name: "div" },
// CreateElement { name: "div" },
// CreateStaticPlaceholder {},
// AppendChildren { m: 1 },
// AppendChildren { m: 1 },
// AppendChildren { m: 2 },
// AppendChildren { m: 1 },
// SaveTemplate { name: "template", m: 1 },
// // The fragment child template
// CreateStaticText { value: "hello" },
// CreateStaticText { value: "world" },
// SaveTemplate { name: "template", m: 2 },
// ]
// );
}
#[test]
@@ -97,17 +88,19 @@ fn create_list() {
})
});
let edits = dom.rebuild().santize();
assert_eq!(
edits.templates,
[
// create template
CreateElement { name: "div" },
CreateStaticText { value: "hello" },
AppendChildren { m: 1 },
SaveTemplate { name: "template", m: 1 }
]
);
let _edits = dom.rebuild().santize();
// note: we dont test template edits anymore
// assert_eq!(
// edits.templates,
// [
// // create template
// CreateElement { name: "div" },
// CreateStaticText { value: "hello" },
// AppendChildren { m: 1 },
// SaveTemplate { name: "template", m: 1 }
// ]
// );
}
#[test]
@@ -122,18 +115,20 @@ fn create_simple() {
});
let edits = dom.rebuild().santize();
assert_eq!(
edits.templates,
[
// create template
CreateElement { name: "div" },
CreateElement { name: "div" },
CreateElement { name: "div" },
CreateElement { name: "div" },
// add to root
SaveTemplate { name: "template", m: 4 }
]
);
// note: we dont test template edits anymore
// assert_eq!(
// edits.templates,
// [
// // create template
// CreateElement { name: "div" },
// CreateElement { name: "div" },
// CreateElement { name: "div" },
// CreateElement { name: "div" },
// // add to root
// SaveTemplate { name: "template", m: 4 }
// ]
// );
}
#[test]
fn create_components() {
@@ -158,26 +153,9 @@ fn create_components() {
})
}
let edits = dom.rebuild().santize();
assert_eq!(
edits.templates,
[
// The "child" template
CreateElement { name: "h1" },
CreateElement { name: "div" },
CreateStaticPlaceholder {},
AppendChildren { m: 1 },
CreateElement { name: "p" },
SaveTemplate { name: "template", m: 3 },
// Sub template for component children
CreateStaticText { value: "abc1" },
SaveTemplate { name: "template", m: 1 },
CreateStaticText { value: "abc2" },
SaveTemplate { name: "template", m: 1 },
CreateStaticText { value: "abc3" },
SaveTemplate { name: "template", m: 1 }
]
);
let _edits = dom.rebuild().santize();
// todo: test this
}
#[test]
@@ -195,23 +173,25 @@ fn anchors() {
// note that the template under "false" doesn't show up since it's not loaded
let edits = dom.rebuild().santize();
assert_eq!(
edits.templates,
[
// create each template
CreateElement { name: "div" },
CreateStaticText { value: "hello" },
AppendChildren { m: 1 },
SaveTemplate { m: 1, name: "template" },
]
);
// note: we dont test template edits anymore
// assert_eq!(
// edits.templates,
// [
// // create each template
// CreateElement { name: "div" },
// CreateStaticText { value: "hello" },
// AppendChildren { m: 1 },
// SaveTemplate { m: 1, name: "template" },
// ]
// );
assert_eq!(
edits.edits,
[
LoadTemplate { name: "template", index: 0, id: ElementId(1) },
CreatePlaceholder { id: ElementId(2) },
AppendChildren { m: 2 }
AppendChildren { m: 2, id: ElementId(0) }
]
)
}
+19 -16
View File
@@ -1,4 +1,4 @@
use dioxus::core::Mutation::*;
// use dioxus::core::Mutation::*;
use dioxus::prelude::*;
#[test]
@@ -11,19 +11,22 @@ fn multiroot() {
})
});
assert_eq!(
dom.rebuild().santize().templates,
[
CreateElement { name: "div" },
CreateStaticText { value: "Hello a" },
AppendChildren { m: 1 },
CreateElement { name: "div" },
CreateStaticText { value: "Hello b" },
AppendChildren { m: 1 },
CreateElement { name: "div" },
CreateStaticText { value: "Hello c" },
AppendChildren { m: 1 },
SaveTemplate { name: "template", m: 3 }
]
)
// note: we dont test template edits anymore
let _templates = dom.rebuild().santize().templates;
// assert_eq!(
// dom.rebuild().santize().templates,
// [
// CreateElement { name: "div" },
// CreateStaticText { value: "Hello a" },
// AppendChildren { m: 1 },
// CreateElement { name: "div" },
// CreateStaticText { value: "Hello b" },
// AppendChildren { m: 1 },
// CreateElement { name: "div" },
// CreateStaticText { value: "Hello c" },
// AppendChildren { m: 1 },
// SaveTemplate { name: "template", m: 3 }
// ]
// )
}
+5 -5
View File
@@ -17,7 +17,7 @@ fn empty_fragment_creates_nothing() {
edits.edits,
[
CreatePlaceholder { id: ElementId(1) },
AppendChildren { m: 1 }
AppendChildren { id: ElementId(0), m: 1 }
]
);
}
@@ -33,7 +33,7 @@ fn root_fragments_work() {
assert_eq!(
vdom.rebuild().edits.last().unwrap(),
&AppendChildren { m: 2 }
&AppendChildren { id: ElementId(0), m: 2 }
);
}
@@ -60,7 +60,7 @@ fn fragments_nested() {
assert_eq!(
vdom.rebuild().edits.last().unwrap(),
&AppendChildren { m: 8 }
&AppendChildren { id: ElementId(0), m: 8 }
);
}
@@ -85,7 +85,7 @@ fn fragments_across_components() {
assert_eq!(
VirtualDom::new(app).rebuild().edits.last().unwrap(),
&AppendChildren { m: 8 }
&AppendChildren { id: ElementId(0), m: 8 }
);
}
@@ -99,6 +99,6 @@ fn list_fragments() {
}
assert_eq!(
VirtualDom::new(app).rebuild().edits.last().unwrap(),
&AppendChildren { m: 7 }
&AppendChildren { id: ElementId(0), m: 7 }
);
}
+24 -23
View File
@@ -27,28 +27,29 @@ fn list_renders() {
let edits = dom.rebuild().santize();
assert_eq!(
edits.templates,
[
// Create the outer div
CreateElement { name: "div" },
// todo: since this is the only child, we should just use
// append when modify the values (IE no need for a placeholder)
CreateStaticPlaceholder,
AppendChildren { m: 1 },
SaveTemplate { name: "template", m: 1 },
// Create the inner template div
CreateElement { name: "div" },
CreateElement { name: "h1" },
CreateStaticText { value: "hello world! " },
AppendChildren { m: 1 },
CreateElement { name: "p" },
CreateTextPlaceholder,
AppendChildren { m: 1 },
AppendChildren { m: 2 },
SaveTemplate { name: "template", m: 1 }
],
);
// note: we dont test template edits anymore
// assert_eq!(
// edits.templates,
// [
// // Create the outer div
// CreateElement { name: "div" },
// // todo: since this is the only child, we should just use
// // append when modify the values (IE no need for a placeholder)
// CreateStaticPlaceholder,
// AppendChildren { m: 1 },
// SaveTemplate { name: "template", m: 1 },
// // Create the inner template div
// CreateElement { name: "div" },
// CreateElement { name: "h1" },
// CreateStaticText { value: "hello world! " },
// AppendChildren { m: 1 },
// CreateElement { name: "p" },
// CreateTextPlaceholder,
// AppendChildren { m: 1 },
// AppendChildren { m: 2 },
// SaveTemplate { name: "template", m: 1 }
// ],
// );
assert_eq!(
edits.edits,
@@ -65,7 +66,7 @@ fn list_renders() {
// Replace the 0th childn on the div with the 3 templates on the stack
ReplacePlaceholder { m: 3, path: &[0] },
// Append the container div to the dom
AppendChildren { m: 1 }
AppendChildren { m: 1, id: ElementId(0) }
],
)
}
+4 -4
View File
@@ -29,7 +29,7 @@ fn nested_passthru_creates() {
edits.edits,
[
LoadTemplate { name: "template", index: 0, id: ElementId(1) },
AppendChildren { m: 1 },
AppendChildren { m: 1, id: ElementId(0) },
]
)
}
@@ -74,7 +74,7 @@ fn nested_passthru_creates_add() {
LoadTemplate { name: "template", index: 0, id: ElementId(3) },
// load div that contains 4
LoadTemplate { name: "template", index: 1, id: ElementId(4) },
AppendChildren { m: 4 },
AppendChildren { id: ElementId(0), m: 4 },
]
);
}
@@ -92,7 +92,7 @@ fn dynamic_node_as_root() {
let edits = dom.rebuild().santize();
// Since the roots were all dynamic, they should not cause any template muations
assert_eq!(edits.templates, []);
assert!(edits.templates.is_empty());
// The root node is text, so we just create it on the spot
assert_eq!(
@@ -100,7 +100,7 @@ fn dynamic_node_as_root() {
[
CreateTextNode { value: "123", id: ElementId(1) },
CreateTextNode { value: "456", id: ElementId(2) },
AppendChildren { m: 2 }
AppendChildren { id: ElementId(0), m: 2 }
]
)
}
+1 -1
View File
@@ -17,7 +17,7 @@ fn cycling_elements() {
edits.edits,
[
LoadTemplate { name: "template", index: 0, id: ElementId(1,) },
AppendChildren { m: 1 },
AppendChildren { m: 1, id: ElementId(0) },
]
);
+1 -1
View File
@@ -69,7 +69,7 @@ fn component_swap() {
LoadTemplate { name: "template", index: 0, id: ElementId(4) },
ReplacePlaceholder { path: &[1], m: 3 },
LoadTemplate { name: "template", index: 0, id: ElementId(5) },
AppendChildren { m: 2 }
AppendChildren { m: 2, id: ElementId(0) }
]
);
+1 -1
View File
@@ -33,7 +33,7 @@ fn keyed_diffing_out_of_order() {
LoadTemplate { name: "template", index: 0, id: ElementId(8,) },
LoadTemplate { name: "template", index: 0, id: ElementId(9,) },
LoadTemplate { name: "template", index: 0, id: ElementId(10,) },
AppendChildren { m: 10 },
AppendChildren { m: 10, id: ElementId(0) },
]
);
+5 -5
View File
@@ -21,7 +21,7 @@ fn list_creates_one_by_one() {
[
LoadTemplate { name: "template", index: 0, id: ElementId(1,) },
AssignId { path: &[0], id: ElementId(2,) },
AppendChildren { m: 1 },
AppendChildren { id: ElementId(0), m: 1 },
]
);
@@ -100,7 +100,7 @@ fn removes_one_by_one() {
// replace the placeholder in the template with the 3 templates on the stack
ReplacePlaceholder { m: 3, path: &[0] },
// Mount the div
AppendChildren { m: 1 }
AppendChildren { id: ElementId(0), m: 1 }
]
);
@@ -165,7 +165,7 @@ fn list_shrink_multiroot() {
[
LoadTemplate { name: "template", index: 0, id: ElementId(1,) },
AssignId { path: &[0,], id: ElementId(2,) },
AppendChildren { m: 1 }
AppendChildren { id: ElementId(0), m: 1 }
]
);
@@ -244,7 +244,7 @@ fn removes_one_by_one_multiroot() {
//
ReplacePlaceholder { path: &[0], m: 6 },
//
AppendChildren { m: 1 }
AppendChildren { id: ElementId(0), m: 1 }
]
);
@@ -320,7 +320,7 @@ fn remove_many() {
edits.edits,
[
CreatePlaceholder { id: ElementId(1,) },
AppendChildren { m: 1 },
AppendChildren { id: ElementId(0), m: 1 },
]
);
+1 -37
View File
@@ -29,42 +29,6 @@ fn dual_stream() {
let edits = dom.rebuild().santize();
use Mutation::*;
assert_eq!(
edits.templates,
[
CreateElement { name: "div" },
SetStaticAttribute { name: "class", value: "asd", ns: None },
CreateElement { name: "div" },
CreateTextPlaceholder,
AppendChildren { m: 1 },
CreateElement { name: "div" },
CreateElement { name: "h1" },
CreateStaticText { value: "var" },
AppendChildren { m: 1 },
CreateElement { name: "p" },
CreateStaticText { value: "you're great!" },
AppendChildren { m: 1 },
CreateElement { name: "div" },
SetStaticAttribute { name: "background-color", value: "red", ns: Some("style") },
CreateElement { name: "h1" },
CreateStaticText { value: "var" },
AppendChildren { m: 1 },
CreateElement { name: "div" },
CreateElement { name: "b" },
CreateStaticText { value: "asd" },
AppendChildren { m: 1 },
CreateStaticText { value: "not great" },
AppendChildren { m: 2 },
AppendChildren { m: 2 },
CreateElement { name: "p" },
CreateStaticText { value: "you're great!" },
AppendChildren { m: 1 },
AppendChildren { m: 4 },
AppendChildren { m: 2 },
SaveTemplate { name: "template", m: 1 }
],
);
assert_eq!(
edits.edits,
[
@@ -72,7 +36,7 @@ fn dual_stream() {
SetAttribute { name: "class", value: "123", id: ElementId(1), ns: None },
NewEventListener { name: "click", scope: ScopeId(0), id: ElementId(1) },
HydrateText { path: &[0, 0], value: "123", id: ElementId(2) },
AppendChildren { m: 1 }
AppendChildren { id: ElementId(0), m: 1 }
],
);
}
+1 -1
View File
@@ -32,7 +32,7 @@ fn manual_diffing() {
[
LoadTemplate { name: "template", index: 0, id: ElementId(3) },
HydrateText { path: &[0], value: "goodbye", id: ElementId(4) },
AppendChildren { m: 1 }
AppendChildren { m: 1, id: ElementId(0) }
]
);
}
+14 -13
View File
@@ -1,5 +1,5 @@
use dioxus::core::ElementId;
use dioxus::core::{Mutation::*, SuspenseBoundary};
use dioxus::core::{Mutation::*, SuspenseContext};
use dioxus::prelude::*;
use dioxus_core::SuspenseContext;
use std::future::IntoFuture;
@@ -12,16 +12,17 @@ async fn it_works() {
let mutations = dom.rebuild().santize();
// We should at least get the top-level template in before pausing for the children
assert_eq!(
mutations.templates,
[
CreateElement { name: "div" },
CreateStaticText { value: "Waiting for child..." },
CreateStaticPlaceholder,
AppendChildren { m: 2 },
SaveTemplate { name: "template", m: 1 }
]
);
// note: we dont test template edits anymore
// assert_eq!(
// mutations.templates,
// [
// CreateElement { name: "div" },
// CreateStaticText { value: "Waiting for child..." },
// CreateStaticPlaceholder,
// AppendChildren { m: 2 },
// SaveTemplate { name: "template", m: 1 }
// ]
// );
// And we should load it in and assign the placeholder properly
assert_eq!(
@@ -31,7 +32,7 @@ async fn it_works() {
// hmmmmmmmmm.... with suspense how do we guarantee that IDs increase linearly?
// can we even?
AssignId { path: &[1], id: ElementId(3) },
AppendChildren { m: 1 },
AppendChildren { m: 1, id: ElementId(0) },
]
);
@@ -50,7 +51,7 @@ fn app(cx: Scope) -> Element {
}
fn suspense_boundary(cx: Scope) -> Element {
cx.use_hook(|| cx.provide_context(Rc::new(SuspenseBoundary::new(cx.scope_id()))));
cx.use_hook(|| cx.provide_context(Rc::new(SuspenseContext::new(cx.scope_id()))));
// Ensure the right types are found
cx.has_context::<SuspenseContext>().unwrap();