Skip to content

Commit fa3d84c

Browse files
committed
feat!: frender-test
1 parent 5cd7950 commit fa3d84c

File tree

11 files changed

+536
-201
lines changed

11 files changed

+536
-201
lines changed

Cargo.lock

Lines changed: 22 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

packages/frender-html/Cargo.toml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ frender-form-control = { version = "0.1.0", path = "../frender-form-control", fe
2525
"ssr",
2626
] }
2727
arrayvec = { version = "0.7.6", default-features = false }
28+
ref-cast = { version = "1.0.23", optional = true }
2829

2930
[dependencies.web-sys]
3031
version = "0.3.60"
@@ -122,7 +123,7 @@ either = [
122123
"frender-dom/either",
123124
"frender-form-control/either",
124125
]
125-
ElementProxyAttrs = []
126+
ElementProxyAttrs = ["dep:ref-cast"]
126127
components = []
127128
chrono = ["frender-form-control/chrono"]
128129
experimental = []

packages/frender-html/src/element_proxy_attrs.rs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,17 @@
11
pub use event_listener::EventListener;
2+
use ref_cast::{ref_cast_custom, RefCastCustom};
23

4+
#[derive(RefCastCustom)]
5+
#[repr(transparent)]
36
pub struct ElementProxyAttrs<E: ?Sized>(pub E);
47

8+
impl<E: ?Sized> ElementProxyAttrs<E> {
9+
#[ref_cast_custom]
10+
fn ref_cast_mut(inner: &mut E) -> &mut Self;
11+
}
12+
13+
mod ui_handle;
14+
515
pub(crate) mod proxy_attr {
616
use frender_common::impl_many;
717
use frender_dom::behaviors;
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
use frender_dom::ui_handle::{ProvideMutMounted, UiHandle, UnmountedUiHandle};
2+
3+
use super::ElementProxyAttrs;
4+
5+
impl<E: UnmountedUiHandle<R>, R: ?Sized> UnmountedUiHandle<R> for ElementProxyAttrs<E> {
6+
type Mounted = ElementProxyAttrs<E::Mounted>;
7+
8+
fn mount(self, render_context: &mut <R>::RenderContext<'_>) -> Self::Mounted
9+
where
10+
R: frender_dom::render::RenderWithContext,
11+
{
12+
ElementProxyAttrs(self.0.mount(render_context))
13+
}
14+
}
15+
16+
impl<E: ProvideMutMounted<R>, R: ?Sized> ProvideMutMounted<R> for ElementProxyAttrs<E> {
17+
fn provide_mut_mounted<Out>(&mut self, renderer: &mut R, f: impl FnOnce(&mut R, &mut Self::Mounted) -> Out) -> Out {
18+
self.0.provide_mut_mounted(
19+
//
20+
renderer,
21+
|renderer, e| f(renderer, ElementProxyAttrs::<E::Mounted>::ref_cast_mut(e)),
22+
)
23+
}
24+
}
25+
26+
impl<E: UiHandle<R>, R: ?Sized> UiHandle<R> for ElementProxyAttrs<E> {
27+
type Unmounted = ElementProxyAttrs<E::Unmounted>;
28+
29+
fn unmount(self, renderer: &mut R) -> Self::Unmounted {
30+
ElementProxyAttrs(self.0.unmount(renderer))
31+
}
32+
33+
fn reposition(&mut self, render_context: &mut <R>::RenderContext<'_>)
34+
where
35+
R: frender_dom::render::RenderWithContext,
36+
{
37+
self.0.reposition(render_context)
38+
}
39+
40+
fn check_and_move_cursor(&self, render_context: &mut <R>::RenderContext<'_>)
41+
where
42+
R: frender_dom::render::RenderWithContext,
43+
{
44+
self.0.check_and_move_cursor(render_context)
45+
}
46+
47+
fn assert_cursor_is_at_self(&self, render_context: &<R>::RenderContext<'_>)
48+
where
49+
R: frender_dom::render::RenderWithContext,
50+
{
51+
self.0.assert_cursor_is_at_self(render_context)
52+
}
53+
}

packages/frender-keyed-elements/tests/html.rs

Lines changed: 13 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,10 @@
22

33
use frender_html::cs;
44
use frender_keyed_elements::{Keyed, KeyedElements};
5-
use frender_test::{element::Node, renderer::RendererWithRoot};
5+
use frender_test::{element::Node, renderer::Root};
66

7-
fn dom_nodes_div_i32(dom: &RendererWithRoot) -> Vec<i32> {
8-
let nodes = dom.nodes();
7+
fn dom_nodes_div_i32(root: &Root) -> Vec<i32> {
8+
let nodes = root.clone_nodes();
99
let mut nodes = nodes.iter();
1010
assert!(nodes.next().unwrap().is_cursor_placeholder());
1111
assert!(nodes.next_back().unwrap().is_cursor_placeholder());
@@ -29,27 +29,25 @@ fn dom_nodes_div_i32(dom: &RendererWithRoot) -> Vec<i32> {
2929
#[cfg(feature = "csr")]
3030
#[test]
3131
fn prepend() {
32-
let mut dom = RendererWithRoot::new();
33-
let mut render_state = Default::default();
32+
use frender_html::CsrElement;
33+
use frender_test::renderer::unpinned_render_init;
3434

35-
assert!(dom.nodes().is_empty());
35+
let (ref mut renderer, ref root, (ref mut state, ref mut ui_handle)) = unpinned_render_init(
36+
KeyedElements((0..5).map(|n| Keyed(n, cs::div().children(n)))),
37+
);
3638

37-
{
38-
let elements = (0..5).map(|n| Keyed(n, cs::div().children(n)));
39-
dom.unpinned_render_update(Elements(elements), &mut render_state);
40-
assert_eq!(dom_nodes_div_i32(&dom), [0, 1, 2, 3, 4]);
41-
}
39+
assert_eq!(dom_nodes_div_i32(root), [0, 1, 2, 3, 4]);
4240

4341
{
4442
let elements = [9, 0, 1, 2, 3, 4].map(|n| Keyed(n, cs::div().children(n)));
45-
dom.unpinned_render_update(Elements(elements), &mut render_state);
46-
assert_eq!(dom_nodes_div_i32(&dom), [9, 0, 1, 2, 3, 4]);
43+
KeyedElements(elements).unpinned_render_update(renderer, state, ui_handle);
44+
assert_eq!(dom_nodes_div_i32(root), [9, 0, 1, 2, 3, 4]);
4745
}
4846

4947
{
5048
let elements = [10, 11, 12, 9, 0, 1, 2, 3, 4].map(|n| Keyed(n, cs::div().children(n)));
51-
dom.unpinned_render_update(Elements(elements), &mut render_state);
49+
KeyedElements(elements).unpinned_render_update(renderer, state, ui_handle);
5250

53-
assert_eq!(dom_nodes_div_i32(&dom), [10, 11, 12, 9, 0, 1, 2, 3, 4]);
51+
assert_eq!(dom_nodes_div_i32(root), [10, 11, 12, 9, 0, 1, 2, 3, 4]);
5452
}
5553
}

0 commit comments

Comments
 (0)