Files
k-frame/crates/client-domain/tests/render_tree_tests.rs

114 lines
3.3 KiB
Rust

use client_domain::{BoundingBox, LayoutEngine};
use domain::{AlignItems, ContainerNode, Direction, JustifyContent, LayoutChild, LayoutNode, Sizing};
fn screen() -> BoundingBox {
BoundingBox::screen(240, 320)
}
#[test]
fn diff_detects_moved_widget_after_layout_change() {
let layout_a = LayoutNode::Container(ContainerNode {
direction: Direction::Row,
gap: 0,
padding: 0,
justify_content: JustifyContent::Start,
align_items: AlignItems::Stretch,
children: vec![
LayoutChild {
sizing: Sizing::Flex(1),
node: LayoutNode::Leaf(1),
},
LayoutChild {
sizing: Sizing::Flex(1),
node: LayoutNode::Leaf(2),
},
],
});
let layout_b = LayoutNode::Container(ContainerNode {
direction: Direction::Column,
gap: 0,
padding: 0,
justify_content: JustifyContent::Start,
align_items: AlignItems::Stretch,
children: vec![
LayoutChild {
sizing: Sizing::Flex(1),
node: LayoutNode::Leaf(1),
},
LayoutChild {
sizing: Sizing::Flex(1),
node: LayoutNode::Leaf(2),
},
],
});
let tree_a = LayoutEngine::compute(&layout_a, screen());
let tree_b = LayoutEngine::compute(&layout_b, screen());
let mut changed = tree_b.diff(&tree_a);
changed.sort();
assert_eq!(changed, vec![1, 2]);
}
#[test]
fn diff_returns_empty_for_identical_layouts() {
let layout = LayoutNode::Container(ContainerNode {
direction: Direction::Row,
gap: 0,
padding: 0,
justify_content: JustifyContent::Start,
align_items: AlignItems::Stretch,
children: vec![
LayoutChild {
sizing: Sizing::Flex(1),
node: LayoutNode::Leaf(1),
},
LayoutChild {
sizing: Sizing::Flex(1),
node: LayoutNode::Leaf(2),
},
],
});
let tree_a = LayoutEngine::compute(&layout, screen());
let tree_b = LayoutEngine::compute(&layout, screen());
assert!(tree_b.diff(&tree_a).is_empty());
}
#[test]
fn diff_detects_added_and_removed_widgets() {
let layout_a = LayoutNode::Container(ContainerNode {
direction: Direction::Row,
gap: 0,
padding: 0,
justify_content: JustifyContent::Start,
align_items: AlignItems::Stretch,
children: vec![LayoutChild {
sizing: Sizing::Flex(1),
node: LayoutNode::Leaf(1),
}],
});
let layout_b = LayoutNode::Container(ContainerNode {
direction: Direction::Row,
gap: 0,
padding: 0,
justify_content: JustifyContent::Start,
align_items: AlignItems::Stretch,
children: vec![LayoutChild {
sizing: Sizing::Flex(1),
node: LayoutNode::Leaf(2),
}],
});
let tree_a = LayoutEngine::compute(&layout_a, screen());
let tree_b = LayoutEngine::compute(&layout_b, screen());
let mut changed = tree_b.diff(&tree_a);
changed.sort();
// widget 1 was removed (in old but not new), widget 2 was added (in new but not old)
assert_eq!(changed, vec![1, 2]);
}