Files
k-frame/crates/client-domain/tests/render_tree_tests.rs
Gabriel Kaszewski fe59b68c37 theme config, layout preview, container alignment
Server: ThemeConfig entity + CRUD (GET/PUT /theme), SQLite persistence,
ThemeUpdate broadcast to ESP32 on save and initial connect.
Client: render engine uses theme colors, full-screen redraw on theme change.
SPA: theme page with color pickers + presets, layout preview with TS port
of layout engine, justify/align controls on containers.
DisplayHint refactored to struct (kind + h_align + v_align).
2026-06-19 03:26:18 +02:00

116 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]);
}