gioser

tawasuyu/taffy

A high performance rust-powered UI layout library

HTML 5544Rust 88Markdown 11TOML 91926 Definitions

⎇ 4745c0f58048abd4ea3651a9eb987e7c0c7b6bc6 tests/node.rs Rust · 190 lines · 7.2 KB History Who touched what raw

Implement new rust API for bindings and release v0.3 4745c0f58 · Emil Sjölander ·

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 }))).unwrap();
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).unwrap();
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).unwrap();
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).unwrap();
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 remove() {
100        let mut stretch = Stretch::new();
101
102        let style2 = Style { flex_direction: FlexDirection::Column, ..Style::default() };
103
104        // Build a linear tree layout: <0> <- <1> <- <2>
105        let node2 = stretch.new_node(style2, vec![]).unwrap();
106        let node1 = stretch.new_node(Style::default(), vec![node2]).unwrap();
107        let node0 = stretch.new_node(Style::default(), vec![node1]).unwrap();
108
109        assert_eq!(stretch.children(node0).unwrap(), vec![node1]);
110
111        // Disconnect the tree: <0> <2>
112        stretch.remove(node1);
113
114        assert!(stretch.style(node1).is_err());
115
116        assert!(stretch.children(node0).unwrap().is_empty());
117        assert!(stretch.children(node2).unwrap().is_empty());
118        assert_eq!(stretch.style(node2).unwrap().flex_direction, style2.flex_direction);
119    }
120
121    #[test]
122    fn set_children() {
123        let mut stretch = Stretch::new();
124
125        let child1 = stretch.new_node(Style::default(), vec![]).unwrap();
126        let child2 = stretch.new_node(Style::default(), vec![]).unwrap();
127        let node = stretch.new_node(Style::default(), vec![child1, child2]).unwrap();
128
129        assert_eq!(stretch.child_count(node).unwrap(), 2);
130        assert_eq!(stretch.children(node).unwrap()[0], child1);
131        assert_eq!(stretch.children(node).unwrap()[1], child2);
132
133        let child3 = stretch.new_node(Style::default(), vec![]).unwrap();
134        let child4 = stretch.new_node(Style::default(), vec![]).unwrap();
135        stretch.set_children(node, vec![child3, child4]).unwrap();
136
137        assert_eq!(stretch.child_count(node).unwrap(), 2);
138        assert_eq!(stretch.children(node).unwrap()[0], child3);
139        assert_eq!(stretch.children(node).unwrap()[1], child4);
140    }
141
142    #[test]
143    fn set_style() {
144        let mut stretch = Stretch::new();
145
146        let node = stretch.new_node(Style::default(), vec![]).unwrap();
147        assert_eq!(stretch.style(node).unwrap().display, Display::Flex);
148
149        stretch.set_style(node, Style { display: Display::None, ..Style::default() }).unwrap();
150        assert_eq!(stretch.style(node).unwrap().display, Display::None);
151    }
152
153    #[test]
154    fn mark_dirty() {
155        let mut stretch = Stretch::new();
156
157        let child1 = stretch.new_node(Style::default(), vec![]).unwrap();
158        let child2 = stretch.new_node(Style::default(), vec![]).unwrap();
159        let node = stretch.new_node(Style::default(), vec![child1, child2]).unwrap();
160
161        stretch.compute_layout(node, stretch::geometry::Size::undefined()).unwrap();
162
163        assert_eq!(stretch.dirty(child1).unwrap(), false);
164        assert_eq!(stretch.dirty(child2).unwrap(), false);
165        assert_eq!(stretch.dirty(node).unwrap(), false);
166
167        stretch.mark_dirty(node).unwrap();
168        assert_eq!(stretch.dirty(child1).unwrap(), false);
169        assert_eq!(stretch.dirty(child2).unwrap(), false);
170        assert_eq!(stretch.dirty(node).unwrap(), true);
171
172        stretch.compute_layout(node, stretch::geometry::Size::undefined()).unwrap();
173        stretch.mark_dirty(child1).unwrap();
174        assert_eq!(stretch.dirty(child1).unwrap(), true);
175        assert_eq!(stretch.dirty(child2).unwrap(), false);
176        assert_eq!(stretch.dirty(node).unwrap(), true);
177    }
178
179    #[test]
180    fn remove_last_node() {
181        let mut stretch = Stretch::new();
182
183        let parent = stretch.new_node(Style::default(), vec![]).unwrap();
184        let child = stretch.new_node(Style::default(), vec![]).unwrap();
185        stretch.add_child(parent, child).unwrap();
186
187        stretch.remove(child);
188        stretch.remove(parent);
189    }
190}