gioser

tawasuyu/taffy

A high performance rust-powered UI layout library

Rust 252HTML 238TOML 3CSS 1626 Definitions

⎇ 96bbe0343300e79075d8be60bd12c8c2c990b261 tests/node.rs Rust · 181 lines · 6.8 KB History Who touched what raw

index: Implement node removal 96bbe0343 · msiglreith ·

1#[cfg(test)]
2mod node {
3    use stretch::geometry::*;
4    use stretch::node::Stretch;
5    use stretch::style::*;
6
7    #[test]
8    fn children() {
9        let mut stretch = Stretch::new();
10        let child1 = stretch.new_node(Style::default(), vec![]).unwrap();
11        let child2 = stretch.new_node(Style::default(), vec![]).unwrap();
12        let node = stretch.new_node(Style::default(), vec![child1, child2]).unwrap();
13
14        assert_eq!(stretch.child_count(node).unwrap(), 2);
15        assert_eq!(stretch.children(node).unwrap()[0], child1);
16        assert_eq!(stretch.children(node).unwrap()[1], child2);
17    }
18
19    #[test]
20    fn set_measure() {
21        let mut stretch = Stretch::new();
22        let node = stretch.new_leaf(Style::default(), Box::new(|_| Ok(Size { width: 200.0, height: 200.0 })));
23        stretch.compute_layout(node, Size::undefined()).unwrap();
24        assert_eq!(stretch.layout(node).unwrap().size.width, 200.0);
25
26        stretch.set_measure(node, Some(Box::new(|_| Ok(Size { width: 100.0, height: 100.0 })))).unwrap();
27        stretch.compute_layout(node, Size::undefined()).unwrap();
28        assert_eq!(stretch.layout(node).unwrap().size.width, 100.0);
29    }
30
31    #[test]
32    fn add_child() {
33        let mut stretch = Stretch::new();
34        let node = stretch.new_node(Style::default(), vec![]).unwrap();
35        assert_eq!(stretch.child_count(node).unwrap(), 0);
36
37        let child1 = stretch.new_node(Style::default(), vec![]).unwrap();
38        stretch.add_child(node, child1).unwrap();
39        assert_eq!(stretch.child_count(node).unwrap(), 1);
40
41        let child2 = stretch.new_node(Style::default(), vec![]).unwrap();
42        stretch.add_child(node, child2);
43        assert_eq!(stretch.child_count(node).unwrap(), 2);
44    }
45
46    #[test]
47    fn remove_child() {
48        let mut stretch = Stretch::new();
49
50        let child1 = stretch.new_node(Style::default(), vec![]).unwrap();
51        let child2 = stretch.new_node(Style::default(), vec![]).unwrap();
52
53        let node = stretch.new_node(Style::default(), vec![child1, child2]).unwrap();
54        assert_eq!(stretch.child_count(node).unwrap(), 2);
55
56        stretch.remove_child(node, child1);
57        assert_eq!(stretch.child_count(node).unwrap(), 1);
58        assert_eq!(stretch.children(node).unwrap()[0], child2);
59
60        stretch.remove_child(node, child2);
61        assert_eq!(stretch.child_count(node).unwrap(), 0);
62    }
63
64    #[test]
65    fn remove_child_at_index() {
66        let mut stretch = Stretch::new();
67
68        let child1 = stretch.new_node(Style::default(), vec![]).unwrap();
69        let child2 = stretch.new_node(Style::default(), vec![]).unwrap();
70
71        let node = stretch.new_node(Style::default(), vec![child1, child2]).unwrap();
72        assert_eq!(stretch.child_count(node).unwrap(), 2);
73
74        stretch.remove_child_at_index(node, 0).unwrap();
75        assert_eq!(stretch.child_count(node).unwrap(), 1);
76        assert_eq!(stretch.children(node).unwrap()[0], child2);
77
78        stretch.remove_child_at_index(node, 0).unwrap();
79        assert_eq!(stretch.child_count(node).unwrap(), 0);
80    }
81
82    #[test]
83    fn replace_child_at_index() {
84        let mut stretch = Stretch::new();
85
86        let child1 = stretch.new_node(Style::default(), vec![]).unwrap();
87        let child2 = stretch.new_node(Style::default(), vec![]).unwrap();
88
89        let node = stretch.new_node(Style::default(), vec![child1]).unwrap();
90        assert_eq!(stretch.child_count(node).unwrap(), 1);
91        assert_eq!(stretch.children(node).unwrap()[0], child1);
92
93        stretch.replace_child_at_index(node, 0, child2).unwrap();
94        assert_eq!(stretch.child_count(node).unwrap(), 1);
95        assert_eq!(stretch.children(node).unwrap()[0], child2);
96    }
97
98    #[test]
99    fn removesaaa() {
100        let mut stretch = Stretch::new();
101
102        let style2 = Style {
103            flex_direction: FlexDirection::Column,
104            ..Style::default()
105        };
106
107        // Build a linear tree layout: <0> <- <1> <- <2>
108        let node2 = stretch.new_node(style2, vec![]).unwrap();
109        let node1 = stretch.new_node(Style::default(), vec![node2]).unwrap();
110        let node0 = stretch.new_node(Style::default(), vec![node1]).unwrap();
111
112        assert_eq!(stretch.children(node0).unwrap(), vec![node1]);
113
114        // Disconnect the tree: <0> <2>
115        stretch.remove(node1);
116
117        assert!(stretch.style(node1).is_err());
118
119        assert!(stretch.children(node0).unwrap().is_empty());
120        assert!(stretch.children(node2).unwrap().is_empty());
121        assert_eq!(stretch.style(node2).unwrap().flex_direction, style2.flex_direction);
122    }
123
124    #[test]
125    fn set_children() {
126        let mut stretch = Stretch::new();
127
128        let child1 = stretch.new_node(Style::default(), vec![]).unwrap();
129        let child2 = stretch.new_node(Style::default(), vec![]).unwrap();
130        let node = stretch.new_node(Style::default(), vec![child1, child2]).unwrap();
131
132        assert_eq!(stretch.child_count(node).unwrap(), 2);
133        assert_eq!(stretch.children(node).unwrap()[0], child1);
134        assert_eq!(stretch.children(node).unwrap()[1], child2);
135
136        let child3 = stretch.new_node(Style::default(), vec![]).unwrap();
137        let child4 = stretch.new_node(Style::default(), vec![]).unwrap();
138        stretch.set_children(node, vec![child3, child4]);
139
140        assert_eq!(stretch.child_count(node).unwrap(), 2);
141        assert_eq!(stretch.children(node).unwrap()[0], child3);
142        assert_eq!(stretch.children(node).unwrap()[1], child4);
143    }
144
145    #[test]
146    fn set_style() {
147        let mut stretch = Stretch::new();
148
149        let node = stretch.new_node(Style::default(), vec![]).unwrap();
150        assert_eq!(stretch.style(node).unwrap().display, Display::Flex);
151
152        stretch.set_style(node, Style { display: Display::None, ..Style::default() }).unwrap();
153        assert_eq!(stretch.style(node).unwrap().display, Display::None);
154    }
155
156    #[test]
157    fn mark_dirty() {
158        let mut stretch = Stretch::new();
159
160        let child1 = stretch.new_node(Style::default(), vec![]).unwrap();
161        let child2 = stretch.new_node(Style::default(), vec![]).unwrap();
162        let node = stretch.new_node(Style::default(), vec![child1, child2]).unwrap();
163
164        stretch.compute_layout(node, stretch::geometry::Size::undefined()).unwrap();
165
166        assert_eq!(stretch.dirty(child1).unwrap(), false);
167        assert_eq!(stretch.dirty(child2).unwrap(), false);
168        assert_eq!(stretch.dirty(node).unwrap(), false);
169
170        stretch.mark_dirty(node);
171        assert_eq!(stretch.dirty(child1).unwrap(), false);
172        assert_eq!(stretch.dirty(child2).unwrap(), false);
173        assert_eq!(stretch.dirty(node).unwrap(), true);
174
175        stretch.compute_layout(node, stretch::geometry::Size::undefined()).unwrap();
176        stretch.mark_dirty(child1);
177        assert_eq!(stretch.dirty(child1).unwrap(), true);
178        assert_eq!(stretch.dirty(child2).unwrap(), false);
179        assert_eq!(stretch.dirty(node).unwrap(), true);
180    }
181}