use azul_core::{
callbacks::{EdgeType, IFrameCallbackReason},
dom::{DomId, NodeId},
events::EasingFunction,
geom::{LogicalPosition, LogicalRect, LogicalSize},
task::{Duration, Instant, SystemTick, SystemTickDiff},
};
use azul_layout::managers::{iframe::IFrameManager, 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_iframe_manager_initial_render() {
let mut iframe_mgr = IFrameManager::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 = iframe_mgr.check_reinvoke(parent_dom, node_id, &scroll_mgr, bounds);
assert_eq!(reason, Some(IFrameCallbackReason::InitialRender));
let reason = iframe_mgr.check_reinvoke(parent_dom, node_id, &scroll_mgr, bounds);
assert_eq!(reason, Some(IFrameCallbackReason::InitialRender));
iframe_mgr.mark_invoked(parent_dom, node_id, IFrameCallbackReason::InitialRender);
let reason = iframe_mgr.check_reinvoke(parent_dom, node_id, &scroll_mgr, bounds);
assert_eq!(reason, None);
}
#[test]
fn test_iframe_manager_bounds_expanded() {
let mut iframe_mgr = IFrameManager::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 = iframe_mgr.check_reinvoke(parent_dom, node_id, &scroll_mgr, small_bounds);
assert_eq!(reason, Some(IFrameCallbackReason::InitialRender));
iframe_mgr.mark_invoked(parent_dom, node_id, IFrameCallbackReason::InitialRender);
iframe_mgr.update_iframe_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 = iframe_mgr.check_reinvoke(parent_dom, node_id, &scroll_mgr, expanded_bounds);
assert_eq!(reason, Some(IFrameCallbackReason::BoundsExpanded));
iframe_mgr.mark_invoked(parent_dom, node_id, IFrameCallbackReason::BoundsExpanded);
let reason = iframe_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 = iframe_mgr.check_reinvoke(parent_dom, node_id, &scroll_mgr, more_expanded_bounds);
assert_eq!(reason, Some(IFrameCallbackReason::BoundsExpanded));
}
#[test]
fn test_iframe_manager_edge_scrolled_bottom() {
let mut iframe_mgr = IFrameManager::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 = iframe_mgr.check_reinvoke(parent_dom, node_id, &scroll_mgr, bounds);
assert_eq!(reason, Some(IFrameCallbackReason::InitialRender));
iframe_mgr.mark_invoked(parent_dom, node_id, IFrameCallbackReason::InitialRender);
iframe_mgr.update_iframe_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 = iframe_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 = iframe_mgr.check_reinvoke(parent_dom, node_id, &scroll_mgr, bounds);
assert_eq!(
reason,
Some(IFrameCallbackReason::EdgeScrolled(EdgeType::Bottom))
);
iframe_mgr.mark_invoked(
parent_dom,
node_id,
IFrameCallbackReason::EdgeScrolled(EdgeType::Bottom),
);
let reason = iframe_mgr.check_reinvoke(parent_dom, node_id, &scroll_mgr, bounds);
assert_eq!(reason, None);
}
#[test]
fn test_iframe_manager_edge_scrolled_right() {
let mut iframe_mgr = IFrameManager::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 = iframe_mgr.check_reinvoke(parent_dom, node_id, &scroll_mgr, bounds);
assert_eq!(reason, Some(IFrameCallbackReason::InitialRender));
iframe_mgr.mark_invoked(parent_dom, node_id, IFrameCallbackReason::InitialRender);
iframe_mgr.update_iframe_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 = iframe_mgr.check_reinvoke(parent_dom, node_id, &scroll_mgr, bounds);
assert_eq!(
reason,
Some(IFrameCallbackReason::EdgeScrolled(EdgeType::Right))
);
}
#[test]
fn test_iframe_manager_nested_dom_ids() {
let mut iframe_mgr = IFrameManager::new();
let parent_dom = DomId { inner: 0 };
let node1 = NodeId::new(1);
let node2 = NodeId::new(2);
let node3 = NodeId::new(3);
let child1 = iframe_mgr.get_or_create_nested_dom_id(parent_dom, node1);
let child2 = iframe_mgr.get_or_create_nested_dom_id(parent_dom, node2);
let child3 = iframe_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,
iframe_mgr.get_or_create_nested_dom_id(parent_dom, node1)
);
assert_eq!(
child2,
iframe_mgr.get_or_create_nested_dom_id(parent_dom, node2)
);
assert_eq!(
iframe_mgr.get_nested_dom_id(parent_dom, node1),
Some(child1)
);
assert_eq!(
iframe_mgr.get_nested_dom_id(parent_dom, node2),
Some(child2)
);
let nonexistent = NodeId::new(999);
assert_eq!(iframe_mgr.get_nested_dom_id(parent_dom, nonexistent), None);
}
#[test]
fn test_iframe_manager_was_invoked_tracking() {
let mut iframe_mgr = IFrameManager::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!(!iframe_mgr.was_iframe_invoked(parent_dom, node_id));
iframe_mgr.check_reinvoke(parent_dom, node_id, &scroll_mgr, bounds);
assert!(!iframe_mgr.was_iframe_invoked(parent_dom, node_id));
iframe_mgr.mark_invoked(parent_dom, node_id, IFrameCallbackReason::InitialRender);
assert!(iframe_mgr.was_iframe_invoked(parent_dom, node_id));
}