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