use rustc_hash::FxHashMap;
use torin::{
prelude::*,
test_utils::*,
};
#[test]
pub fn caching() {
let (mut layout, mut measurer) = test_utils();
let mut mocked_tree = TestingTree::default();
mocked_tree.add(
0,
None,
vec![1],
Node::from_size_and_padding(
Size::Pixels(Length::new(200.0)),
Size::Pixels(Length::new(200.0)),
Gaps::new(5.0, 0.0, 0.0, 0.0),
),
);
mocked_tree.add(
1,
Some(0),
vec![],
Node::from_size_and_direction(
Size::Percentage(Length::new(100.0)),
Size::Percentage(Length::new(100.0)),
Direction::Vertical,
),
);
layout.measure(
0,
Rect::new(Point2D::new(0.0, 0.0), Size2D::new(1000.0, 1000.0)),
&mut measurer,
&mut mocked_tree,
);
assert_eq!(
layout.get(&1).unwrap().area,
Rect::new(Point2D::new(0.0, 5.0), Size2D::new(200.0, 195.0)),
);
mocked_tree.set_node(
1,
Node::from_size_and_direction(
Size::Percentage(Length::new(50.0)),
Size::Percentage(Length::new(100.0)),
Direction::Vertical,
),
);
layout.invalidate(1);
layout.measure(
0,
Rect::new(Point2D::new(0.0, 0.0), Size2D::new(1000.0, 1000.0)),
&mut measurer,
&mut mocked_tree,
);
assert_eq!(
layout.get(&1).unwrap().area,
Rect::new(Point2D::new(0.0, 5.0), Size2D::new(100.0, 195.0)),
);
}
#[test]
pub fn layout_dirty_nodes() {
let (mut layout, mut measurer) = test_utils();
let mut mocked_tree = TestingTree::default();
mocked_tree.add(
0,
None,
vec![1],
Node::from_size_and_direction(
Size::Pixels(Length::new(200.0)),
Size::Pixels(Length::new(200.0)),
Direction::Vertical,
),
);
mocked_tree.add(
1,
None,
vec![2],
Node::from_size_and_direction(
Size::Pixels(Length::new(100.0)),
Size::Pixels(Length::new(100.0)),
Direction::Vertical,
),
);
mocked_tree.add(
2,
Some(1),
vec![],
Node::from_size_and_direction(
Size::Pixels(Length::new(50.0)),
Size::Pixels(Length::new(50.0)),
Direction::Vertical,
),
);
layout.measure(
0,
Rect::new(Point2D::new(0.0, 0.0), Size2D::new(1000.0, 1000.0)),
&mut measurer,
&mut mocked_tree,
);
assert_eq!(
layout.get(&0).unwrap().area,
Rect::new(Point2D::new(0.0, 0.0), Size2D::new(200.0, 200.0)),
);
assert_eq!(
layout.get(&1).unwrap().area,
Rect::new(Point2D::new(0.0, 0.0), Size2D::new(100.0, 100.0)),
);
assert_eq!(
layout.get(&2).unwrap().area,
Rect::new(Point2D::new(0.0, 0.0), Size2D::new(50.0, 50.0)),
);
mocked_tree.set_node(
2,
Node::from_size_and_direction(
Size::Pixels(Length::new(10.0)),
Size::Pixels(Length::new(10.0)),
Direction::Vertical,
),
);
layout.invalidate(2);
assert_eq!(
layout.get_dirty_nodes(),
&FxHashMap::from_iter([(2, DirtyReason::None)])
);
mocked_tree.set_node(
1,
Node::from_size_and_direction(
Size::Inner,
Size::Pixels(Length::new(10.0)),
Direction::Vertical,
),
);
layout.invalidate(1);
assert_eq!(
layout.get_dirty_nodes(),
&FxHashMap::from_iter([(2, DirtyReason::None), (1, DirtyReason::None)])
);
mocked_tree.set_node(
2,
Node::from_size_and_direction(
Size::Pixels(Length::new(50.0)),
Size::Pixels(Length::new(50.0)),
Direction::Vertical,
),
);
layout.invalidate(2);
assert_eq!(
layout.get_dirty_nodes(),
&FxHashMap::from_iter([(2, DirtyReason::None), (1, DirtyReason::None)])
);
mocked_tree.set_node(
0,
Node::from_size_and_direction(
Size::Pixels(Length::new(150.0)),
Size::Pixels(Length::new(150.0)),
Direction::Vertical,
),
);
layout.invalidate(0);
assert_eq!(
layout.get_dirty_nodes(),
&FxHashMap::from_iter([
(2, DirtyReason::None),
(1, DirtyReason::None),
(0, DirtyReason::None)
])
);
}
#[test]
pub fn node_removal() {
let (mut layout, mut measurer) = test_utils();
let mut mocked_tree = TestingTree::default();
mocked_tree.add(
0,
None,
vec![1],
Node::from_size_and_direction(
Size::Pixels(Length::new(200.0)),
Size::Pixels(Length::new(200.0)),
Direction::Vertical,
),
);
mocked_tree.add(
1,
Some(0),
vec![2, 3],
Node::from_size_and_direction(Size::Inner, Size::Inner, Direction::Vertical),
);
mocked_tree.add(
2,
Some(1),
vec![4],
Node::from_size_and_direction(
Size::Pixels(Length::new(200.0)),
Size::Pixels(Length::new(200.0)),
Direction::Vertical,
),
);
mocked_tree.add(
3,
Some(1),
vec![],
Node::from_size_and_direction(
Size::Pixels(Length::new(200.0)),
Size::Pixels(Length::new(200.0)),
Direction::Vertical,
),
);
mocked_tree.add(
4,
Some(2),
vec![],
Node::from_size_and_direction(
Size::Pixels(Length::new(200.0)),
Size::Pixels(Length::new(200.0)),
Direction::Vertical,
),
);
layout.measure(
0,
Rect::new(Point2D::new(0.0, 0.0), Size2D::new(1000.0, 1000.0)),
&mut measurer,
&mut mocked_tree,
);
assert_eq!(layout.size(), 5);
assert_eq!(
layout.get(&0).unwrap().area,
Rect::new(Point2D::new(0.0, 0.0), Size2D::new(200.0, 200.0)),
);
assert_eq!(
layout.get(&1).unwrap().area,
Rect::new(Point2D::new(0.0, 0.0), Size2D::new(200.0, 400.0)),
);
assert_eq!(
layout.get(&3).unwrap().area,
Rect::new(Point2D::new(0.0, 200.0), Size2D::new(200.0, 200.0)),
);
layout.remove(2, &mut mocked_tree, true);
mocked_tree.remove(2);
layout.find_best_root(&mut mocked_tree);
assert_eq!(
layout.get_dirty_nodes(),
&FxHashMap::from_iter([(1, DirtyReason::None)])
);
assert_eq!(layout.size(), 3);
layout.measure(
0,
Rect::new(Point2D::new(0.0, 0.0), Size2D::new(1000.0, 1000.0)),
&mut measurer,
&mut mocked_tree,
);
assert_eq!(
layout.get(&0).unwrap().area,
Rect::new(Point2D::new(0.0, 0.0), Size2D::new(200.0, 200.0)),
);
assert_eq!(
layout.get(&1).unwrap().area,
Rect::new(Point2D::new(0.0, 0.0), Size2D::new(200.0, 200.0)),
);
assert_eq!(
layout.get(&3).unwrap().area,
Rect::new(Point2D::new(0.0, 0.0), Size2D::new(200.0, 200.0)),
);
}
#[test]
pub fn deep_tree() {
let (mut layout, mut measurer) = test_utils();
let mut mocked_tree = TestingTree::default();
mocked_tree.add(
0,
None,
vec![1],
Node::from_size_and_direction(
Size::Pixels(Length::new(200.0)),
Size::Pixels(Length::new(200.0)),
Direction::Vertical,
),
);
mocked_tree.add(
1,
Some(0),
vec![2],
Node::from_size_and_direction(
Size::Pixels(Length::new(100.0)),
Size::Pixels(Length::new(100.0)),
Direction::Vertical,
),
);
mocked_tree.add(
2,
Some(1),
vec![3],
Node::from_size_and_direction(
Size::Percentage(Length::new(100.0)),
Size::Percentage(Length::new(100.0)),
Direction::Vertical,
),
);
mocked_tree.add(
3,
Some(2),
vec![4],
Node::from_size_and_direction(
Size::Percentage(Length::new(100.0)),
Size::Percentage(Length::new(100.0)),
Direction::Vertical,
),
);
mocked_tree.add(
4,
Some(3),
vec![5],
Node::from_size_and_direction(
Size::Percentage(Length::new(100.0)),
Size::Percentage(Length::new(100.0)),
Direction::Vertical,
),
);
mocked_tree.add(
5,
Some(4),
vec![],
Node::from_size_and_direction(
Size::Percentage(Length::new(100.0)),
Size::Percentage(Length::new(100.0)),
Direction::Vertical,
),
);
layout.find_best_root(&mut mocked_tree);
layout.measure(
0,
Rect::new(Point2D::new(0.0, 0.0), Size2D::new(1000.0, 1000.0)),
&mut measurer,
&mut mocked_tree,
);
mocked_tree.set_node(
4,
Node::from_size_and_direction(
Size::Percentage(Length::new(200.0)),
Size::Percentage(Length::new(200.0)),
Direction::Vertical,
),
);
layout.invalidate(4);
layout.find_best_root(&mut mocked_tree);
assert_eq!(layout.get_root_candidate(), RootNodeCandidate::Valid(4));
layout.measure(
0,
Rect::new(Point2D::new(0.0, 0.0), Size2D::new(1000.0, 1000.0)),
&mut measurer,
&mut mocked_tree,
);
assert_eq!(layout.get_root_candidate(), RootNodeCandidate::None);
}
#[test]
pub fn node_reordering() {
let (mut layout, mut measurer) = test_utils();
let mut mocked_tree = TestingTree::default();
mocked_tree.add(
0,
None,
vec![1, 2],
Node::from_size_and_direction(
Size::Pixels(Length::new(200.0)),
Size::Pixels(Length::new(200.0)),
Direction::Vertical,
),
);
mocked_tree.add(
1,
Some(0),
vec![],
Node::from_size_and_direction(
Size::Pixels(Length::new(200.0)),
Size::Pixels(Length::new(100.0)),
Direction::Vertical,
),
);
mocked_tree.add(
2,
Some(0),
vec![],
Node::from_size_and_direction(
Size::Pixels(Length::new(200.0)),
Size::Pixels(Length::new(100.0)),
Direction::Vertical,
),
);
layout.measure(
0,
Rect::new(Point2D::new(0.0, 0.0), Size2D::new(1000.0, 1000.0)),
&mut measurer,
&mut mocked_tree,
);
assert_eq!(
layout.get(&0).unwrap().area,
Rect::new(Point2D::new(0.0, 0.0), Size2D::new(200.0, 200.0)),
);
assert_eq!(
layout.get(&1).unwrap().area,
Rect::new(Point2D::new(0.0, 0.0), Size2D::new(200.0, 100.0)),
);
assert_eq!(
layout.get(&2).unwrap().area,
Rect::new(Point2D::new(0.0, 100.0), Size2D::new(200.0, 100.0)),
);
layout.invalidate_with_reason(1, DirtyReason::Reorder);
layout.invalidate_with_reason(2, DirtyReason::Reorder);
mocked_tree.add(
0,
None,
vec![2, 1],
Node::from_size_and_direction(
Size::Pixels(Length::new(200.0)),
Size::Pixels(Length::new(200.0)),
Direction::Vertical,
),
);
layout.find_best_root(&mut mocked_tree);
layout.measure(
0,
Rect::new(Point2D::new(0.0, 0.0), Size2D::new(1000.0, 1000.0)),
&mut measurer,
&mut mocked_tree,
);
assert_eq!(
layout.get(&2).unwrap().area,
Rect::new(Point2D::new(0.0, 0.0), Size2D::new(200.0, 100.0)),
);
assert_eq!(
layout.get(&1).unwrap().area,
Rect::new(Point2D::new(0.0, 100.0), Size2D::new(200.0, 100.0)),
);
layout.invalidate_with_reason(1, DirtyReason::None);
mocked_tree.add(
0,
None,
vec![1, 2],
Node::from_size_and_direction(
Size::Pixels(Length::new(200.0)),
Size::Pixels(Length::new(200.0)),
Direction::Vertical,
),
);
layout.find_best_root(&mut mocked_tree);
assert_eq!(
layout.get(&2).unwrap().area,
Rect::new(Point2D::new(0.0, 0.0), Size2D::new(200.0, 100.0)),
);
assert_eq!(
layout.get(&1).unwrap().area,
Rect::new(Point2D::new(0.0, 100.0), Size2D::new(200.0, 100.0)),
);
}