114 lines
3.3 KiB
Rust
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]);
|
|
}
|