use azul_core::{
callbacks::{EdgeType, VirtualViewCallbackReason},
dom::{DomId, NodeId},
events::EasingFunction,
geom::{LogicalPosition, LogicalRect, LogicalSize},
task::{Duration, Instant, SystemTick, SystemTickDiff},
};
use azul_layout::managers::{virtual_view::VirtualViewManager, scroll_state::ScrollManager};
fn test_instant() -> Instant {
#[cfg(feature = "std")]
{
Instant::System(std::time::Instant::now().into())
}
#[cfg(not(feature = "std"))]
{
Instant::Tick(SystemTick { tick_counter: 0 })
}
}
fn test_duration_zero() -> Duration {
#[cfg(feature = "std")]
{
Duration::System(std::time::Duration::from_secs(0).into())
}
#[cfg(not(feature = "std"))]
{
Duration::Tick(SystemTickDiff { tick_diff: 0 })
}
}
#[test]
fn test_virtual_view_manager_initial_render() {
let mut virtual_view_mgr = VirtualViewManager::new();
let scroll_mgr = ScrollManager::new();
let _now = test_instant();
let parent_dom = DomId { inner: 0 };
let node_id = NodeId::new(5);
let bounds = LogicalRect::new(
LogicalPosition::new(0.0, 0.0),
LogicalSize::new(800.0, 600.0),
);
let reason = virtual_view_mgr.check_reinvoke(parent_dom, node_id, &scroll_mgr, bounds);
assert_eq!(reason, Some(VirtualViewCallbackReason::InitialRender));
let reason = virtual_view_mgr.check_reinvoke(parent_dom, node_id, &scroll_mgr, bounds);
assert_eq!(reason, Some(VirtualViewCallbackReason::InitialRender));
virtual_view_mgr.mark_invoked(parent_dom, node_id, VirtualViewCallbackReason::InitialRender);
let reason = virtual_view_mgr.check_reinvoke(parent_dom, node_id, &scroll_mgr, bounds);
assert_eq!(reason, None);
}
#[test]
fn test_virtual_view_manager_bounds_expanded() {
let mut virtual_view_mgr = VirtualViewManager::new();
let scroll_mgr = ScrollManager::new();
let _now = test_instant();
let parent_dom = DomId { inner: 0 };
let node_id = NodeId::new(5);
let small_bounds = LogicalRect::new(
LogicalPosition::new(0.0, 0.0),
LogicalSize::new(400.0, 300.0),
);
let reason = virtual_view_mgr.check_reinvoke(parent_dom, node_id, &scroll_mgr, small_bounds);
assert_eq!(reason, Some(VirtualViewCallbackReason::InitialRender));
virtual_view_mgr.mark_invoked(parent_dom, node_id, VirtualViewCallbackReason::InitialRender);
virtual_view_mgr.update_virtual_view_info(
parent_dom,
node_id,
LogicalSize::new(400.0, 300.0),
LogicalSize::new(400.0, 300.0),
);
let expanded_bounds = LogicalRect::new(
LogicalPosition::new(0.0, 0.0),
LogicalSize::new(800.0, 300.0),
);
let reason = virtual_view_mgr.check_reinvoke(parent_dom, node_id, &scroll_mgr, expanded_bounds);
assert_eq!(reason, Some(VirtualViewCallbackReason::BoundsExpanded));
virtual_view_mgr.mark_invoked(parent_dom, node_id, VirtualViewCallbackReason::BoundsExpanded);
let reason = virtual_view_mgr.check_reinvoke(parent_dom, node_id, &scroll_mgr, expanded_bounds);
assert_eq!(reason, None);
let more_expanded_bounds = LogicalRect::new(
LogicalPosition::new(0.0, 0.0),
LogicalSize::new(800.0, 600.0),
);
let reason = virtual_view_mgr.check_reinvoke(parent_dom, node_id, &scroll_mgr, more_expanded_bounds);
assert_eq!(reason, Some(VirtualViewCallbackReason::BoundsExpanded));
}
#[test]
fn test_virtual_view_manager_edge_scrolled_bottom() {
let mut virtual_view_mgr = VirtualViewManager::new();
let mut scroll_mgr = ScrollManager::new();
let now = test_instant();
let parent_dom = DomId { inner: 0 };
let node_id = NodeId::new(5);
let bounds = LogicalRect::new(
LogicalPosition::new(0.0, 0.0),
LogicalSize::new(800.0, 600.0),
);
let reason = virtual_view_mgr.check_reinvoke(parent_dom, node_id, &scroll_mgr, bounds);
assert_eq!(reason, Some(VirtualViewCallbackReason::InitialRender));
virtual_view_mgr.mark_invoked(parent_dom, node_id, VirtualViewCallbackReason::InitialRender);
virtual_view_mgr.update_virtual_view_info(
parent_dom,
node_id,
LogicalSize::new(800.0, 2000.0), LogicalSize::new(800.0, 2000.0),
);
scroll_mgr.update_node_bounds(
parent_dom,
node_id,
bounds,
LogicalRect::new(LogicalPosition::zero(), LogicalSize::new(800.0, 2000.0)),
now.clone(),
);
let reason = virtual_view_mgr.check_reinvoke(parent_dom, node_id, &scroll_mgr, bounds);
assert_eq!(reason, None);
let scroll_offset = LogicalPosition::new(0.0, 1300.0); scroll_mgr.scroll_to(
parent_dom,
node_id,
scroll_offset,
test_duration_zero(),
EasingFunction::Linear,
now.clone(),
);
scroll_mgr.tick(now.clone());
let reason = virtual_view_mgr.check_reinvoke(parent_dom, node_id, &scroll_mgr, bounds);
assert_eq!(
reason,
Some(VirtualViewCallbackReason::EdgeScrolled(EdgeType::Bottom))
);
virtual_view_mgr.mark_invoked(
parent_dom,
node_id,
VirtualViewCallbackReason::EdgeScrolled(EdgeType::Bottom),
);
let reason = virtual_view_mgr.check_reinvoke(parent_dom, node_id, &scroll_mgr, bounds);
assert_eq!(reason, None);
}
#[test]
fn test_virtual_view_manager_edge_scrolled_right() {
let mut virtual_view_mgr = VirtualViewManager::new();
let mut scroll_mgr = ScrollManager::new();
let now = test_instant();
let parent_dom = DomId { inner: 0 };
let node_id = NodeId::new(7);
let bounds = LogicalRect::new(
LogicalPosition::new(0.0, 0.0),
LogicalSize::new(800.0, 600.0),
);
let reason = virtual_view_mgr.check_reinvoke(parent_dom, node_id, &scroll_mgr, bounds);
assert_eq!(reason, Some(VirtualViewCallbackReason::InitialRender));
virtual_view_mgr.mark_invoked(parent_dom, node_id, VirtualViewCallbackReason::InitialRender);
virtual_view_mgr.update_virtual_view_info(
parent_dom,
node_id,
LogicalSize::new(3000.0, 600.0), LogicalSize::new(3000.0, 600.0),
);
scroll_mgr.update_node_bounds(
parent_dom,
node_id,
bounds,
LogicalRect::new(LogicalPosition::zero(), LogicalSize::new(3000.0, 600.0)),
now.clone(),
);
let scroll_offset = LogicalPosition::new(2100.0, 0.0); scroll_mgr.scroll_to(
parent_dom,
node_id,
scroll_offset,
test_duration_zero(),
EasingFunction::Linear,
now.clone(),
);
scroll_mgr.tick(now.clone());
let reason = virtual_view_mgr.check_reinvoke(parent_dom, node_id, &scroll_mgr, bounds);
assert_eq!(
reason,
Some(VirtualViewCallbackReason::EdgeScrolled(EdgeType::Right))
);
}
#[test]
fn test_virtual_view_manager_nested_dom_ids() {
let mut virtual_view_mgr = VirtualViewManager::new();
let parent_dom = DomId { inner: 0 };
let node1 = NodeId::new(1);
let node2 = NodeId::new(2);
let node3 = NodeId::new(3);
let child1 = virtual_view_mgr.get_or_create_nested_dom_id(parent_dom, node1);
let child2 = virtual_view_mgr.get_or_create_nested_dom_id(parent_dom, node2);
let child3 = virtual_view_mgr.get_or_create_nested_dom_id(parent_dom, node3);
assert_ne!(child1, child2);
assert_ne!(child2, child3);
assert_ne!(child1, child3);
assert_eq!(
child1,
virtual_view_mgr.get_or_create_nested_dom_id(parent_dom, node1)
);
assert_eq!(
child2,
virtual_view_mgr.get_or_create_nested_dom_id(parent_dom, node2)
);
assert_eq!(
virtual_view_mgr.get_nested_dom_id(parent_dom, node1),
Some(child1)
);
assert_eq!(
virtual_view_mgr.get_nested_dom_id(parent_dom, node2),
Some(child2)
);
let nonexistent = NodeId::new(999);
assert_eq!(virtual_view_mgr.get_nested_dom_id(parent_dom, nonexistent), None);
}
#[test]
fn test_virtual_view_manager_was_invoked_tracking() {
let mut virtual_view_mgr = VirtualViewManager::new();
let scroll_mgr = ScrollManager::new();
let parent_dom = DomId { inner: 0 };
let node_id = NodeId::new(5);
let bounds = LogicalRect::new(
LogicalPosition::new(0.0, 0.0),
LogicalSize::new(800.0, 600.0),
);
assert!(!virtual_view_mgr.was_virtual_view_invoked(parent_dom, node_id));
virtual_view_mgr.check_reinvoke(parent_dom, node_id, &scroll_mgr, bounds);
assert!(!virtual_view_mgr.was_virtual_view_invoked(parent_dom, node_id));
virtual_view_mgr.mark_invoked(parent_dom, node_id, VirtualViewCallbackReason::InitialRender);
assert!(virtual_view_mgr.was_virtual_view_invoked(parent_dom, node_id));
}