1#[cfg(test)]
2mod measure {
3 use stretch::number::OrElse;
4
5 #[test]
6 fn measure_root() {
7 let layout = stretch::compute(&stretch::style::Node {
8 measure: Some(&|constraint| stretch::geometry::Size {
9 width: constraint.width.or_else(100.0),
10 height: constraint.height.or_else(100.0),
11 }),
12 ..Default::default()
13 });
14
15 assert_eq!(layout.size.width, 100.0);
16 assert_eq!(layout.size.height, 100.0);
17 }
18
19 #[test]
20 fn measure_child() {
21 let layout = stretch::compute(&stretch::style::Node {
22 children: vec![stretch::style::Node {
23 measure: Some(&|constraint| stretch::geometry::Size {
24 width: constraint.width.or_else(100.0),
25 height: constraint.height.or_else(100.0),
26 }),
27 ..Default::default()
28 }],
29 ..Default::default()
30 });
31
32 assert_eq!(layout.size.width, 100.0);
33 assert_eq!(layout.size.height, 100.0);
34
35 assert_eq!(layout.children[0].size.width, 100.0);
36 assert_eq!(layout.children[0].size.height, 100.0);
37 }
38
39 #[test]
40 fn measure_child_constraint() {
41 let layout = stretch::compute(&stretch::style::Node {
42 size: stretch::geometry::Size { width: stretch::style::Dimension::Points(50.0), ..Default::default() },
43 children: vec![stretch::style::Node {
44 measure: Some(&|constraint| stretch::geometry::Size {
45 width: constraint.width.or_else(100.0),
46 height: constraint.height.or_else(100.0),
47 }),
48 ..Default::default()
49 }],
50 ..Default::default()
51 });
52
53 assert_eq!(layout.size.width, 50.0);
54 assert_eq!(layout.size.height, 100.0);
55
56 assert_eq!(layout.children[0].size.width, 50.0);
57 assert_eq!(layout.children[0].size.height, 100.0);
58 }
59
60 #[test]
61 fn measure_child_constraint_padding_parent() {
62 let layout = stretch::compute(&stretch::style::Node {
63 size: stretch::geometry::Size { width: stretch::style::Dimension::Points(50.0), ..Default::default() },
64 padding: stretch::geometry::Rect {
65 start: stretch::style::Dimension::Points(10.0),
66 end: stretch::style::Dimension::Points(10.0),
67 top: stretch::style::Dimension::Points(10.0),
68 bottom: stretch::style::Dimension::Points(10.0),
69 },
70 children: vec![stretch::style::Node {
71 measure: Some(&|constraint| stretch::geometry::Size {
72 width: constraint.width.or_else(100.0),
73 height: constraint.height.or_else(100.0),
74 }),
75 ..Default::default()
76 }],
77 ..Default::default()
78 });
79
80 assert_eq!(layout.size.width, 50.0);
81 assert_eq!(layout.size.height, 120.0);
82
83 assert_eq!(layout.children[0].size.width, 30.0);
84 assert_eq!(layout.children[0].size.height, 100.0);
85 }
86
87 #[test]
88 fn measure_child_with_flex_grow() {
89 let layout = stretch::compute(&stretch::style::Node {
90 size: stretch::geometry::Size { width: stretch::style::Dimension::Points(100.0), ..Default::default() },
91 children: vec![
92 stretch::style::Node {
93 size: stretch::geometry::Size {
94 width: stretch::style::Dimension::Points(50.0),
95 height: stretch::style::Dimension::Points(50.0),
96 },
97 ..Default::default()
98 },
99 stretch::style::Node {
100 measure: Some(&|constraint| stretch::geometry::Size {
101 width: constraint.width.or_else(10.0),
102 height: constraint.height.or_else(50.0),
103 }),
104 flex_grow: 1.0,
105 ..Default::default()
106 },
107 ],
108 ..Default::default()
109 });
110
111 assert_eq!(layout.children[1].size.width, 50.0);
112 assert_eq!(layout.children[1].size.height, 50.0);
113 }
114
115 #[test]
116 fn measure_child_with_flex_shrink() {
117 let layout = stretch::compute(&stretch::style::Node {
118 size: stretch::geometry::Size { width: stretch::style::Dimension::Points(100.0), ..Default::default() },
119 children: vec![
120 stretch::style::Node {
121 size: stretch::geometry::Size {
122 width: stretch::style::Dimension::Points(50.0),
123 height: stretch::style::Dimension::Points(50.0),
124 },
125 flex_shrink: 0.0,
126 ..Default::default()
127 },
128 stretch::style::Node {
129 measure: Some(&|constraint| stretch::geometry::Size {
130 width: constraint.width.or_else(100.0),
131 height: constraint.height.or_else(50.0),
132 }),
133 ..Default::default()
134 },
135 ],
136 ..Default::default()
137 });
138
139 assert_eq!(layout.children[1].size.width, 50.0);
140 assert_eq!(layout.children[1].size.height, 50.0);
141 }
142
143 #[test]
144 fn remeasure_child_after_growing() {
145 let layout = stretch::compute(&stretch::style::Node {
146 size: stretch::geometry::Size { width: stretch::style::Dimension::Points(100.0), ..Default::default() },
147 align_items: stretch::style::AlignItems::FlexStart,
148 children: vec![
149 stretch::style::Node {
150 size: stretch::geometry::Size {
151 width: stretch::style::Dimension::Points(50.0),
152 height: stretch::style::Dimension::Points(50.0),
153 },
154 ..Default::default()
155 },
156 stretch::style::Node {
157 measure: Some(&|constraint| {
158 let width = constraint.width.or_else(10.0);
159 let height = constraint.height.or_else(width * 2.0);
160 stretch::geometry::Size { width, height }
161 }),
162 flex_grow: 1.0,
163 ..Default::default()
164 },
165 ],
166 ..Default::default()
167 });
168
169 assert_eq!(layout.children[1].size.width, 50.0);
170 assert_eq!(layout.children[1].size.height, 100.0);
171 }
172
173 #[test]
174 fn remeasure_child_after_shrinking() {
175 let layout = stretch::compute(&stretch::style::Node {
176 size: stretch::geometry::Size { width: stretch::style::Dimension::Points(100.0), ..Default::default() },
177 align_items: stretch::style::AlignItems::FlexStart,
178 children: vec![
179 stretch::style::Node {
180 size: stretch::geometry::Size {
181 width: stretch::style::Dimension::Points(50.0),
182 height: stretch::style::Dimension::Points(50.0),
183 },
184 flex_shrink: 0.0,
185 ..Default::default()
186 },
187 stretch::style::Node {
188 measure: Some(&|constraint| {
189 let width = constraint.width.or_else(100.0);
190 let height = constraint.height.or_else(width * 2.0);
191 stretch::geometry::Size { width, height }
192 }),
193 ..Default::default()
194 },
195 ],
196 ..Default::default()
197 });
198
199 assert_eq!(layout.children[1].size.width, 50.0);
200 assert_eq!(layout.children[1].size.height, 100.0);
201 }
202
203 #[test]
204 fn width_overrides_measure() {
205 let layout = stretch::compute(&stretch::style::Node {
206 children: vec![stretch::style::Node {
207 size: stretch::geometry::Size { width: stretch::style::Dimension::Points(50.0), ..Default::default() },
208 measure: Some(&|constraint| stretch::geometry::Size {
209 width: constraint.width.or_else(100.0),
210 height: constraint.height.or_else(100.0),
211 }),
212 ..Default::default()
213 }],
214 ..Default::default()
215 });
216
217 assert_eq!(layout.children[0].size.width, 50.0);
218 assert_eq!(layout.children[0].size.height, 100.0);
219 }
220
221 #[test]
222 fn height_overrides_measure() {
223 let layout = stretch::compute(&stretch::style::Node {
224 children: vec![stretch::style::Node {
225 size: stretch::geometry::Size { height: stretch::style::Dimension::Points(50.0), ..Default::default() },
226 measure: Some(&|constraint| stretch::geometry::Size {
227 width: constraint.width.or_else(100.0),
228 height: constraint.height.or_else(100.0),
229 }),
230 ..Default::default()
231 }],
232 ..Default::default()
233 });
234
235 assert_eq!(layout.children[0].size.width, 100.0);
236 assert_eq!(layout.children[0].size.height, 50.0);
237 }
238
239 #[test]
240 fn flex_basis_overrides_measure() {
241 let layout = stretch::compute(&stretch::style::Node {
242 size: stretch::geometry::Size {
243 width: stretch::style::Dimension::Points(200.0),
244 height: stretch::style::Dimension::Points(100.0),
245 },
246 children: vec![
247 stretch::style::Node {
248 flex_basis: stretch::style::Dimension::Points(50.0),
249 flex_grow: 1.0,
250 ..Default::default()
251 },
252 stretch::style::Node {
253 flex_basis: stretch::style::Dimension::Points(50.0),
254 flex_grow: 1.0,
255 measure: Some(&|constraint| stretch::geometry::Size {
256 width: constraint.width.or_else(100.0),
257 height: constraint.height.or_else(100.0),
258 }),
259 ..Default::default()
260 },
261 ],
262 ..Default::default()
263 });
264
265 assert_eq!(layout.children[0].size.width, 100.0);
266 assert_eq!(layout.children[0].size.height, 100.0);
267 assert_eq!(layout.children[1].size.width, 100.0);
268 assert_eq!(layout.children[1].size.height, 100.0);
269 }
270
271 #[test]
272 fn stretch_overrides_measure() {
273 let layout = stretch::compute(&stretch::style::Node {
274 size: stretch::geometry::Size {
275 width: stretch::style::Dimension::Points(100.0),
276 height: stretch::style::Dimension::Points(100.0),
277 },
278 children: vec![stretch::style::Node {
279 measure: Some(&|constraint| stretch::geometry::Size {
280 width: constraint.width.or_else(50.0),
281 height: constraint.height.or_else(50.0),
282 }),
283 ..Default::default()
284 }],
285 ..Default::default()
286 });
287
288 assert_eq!(layout.children[0].size.width, 50.0);
289 assert_eq!(layout.children[0].size.height, 100.0);
290 }
291
292 #[test]
293 fn measure_absolute_child() {
294 let layout = stretch::compute(&stretch::style::Node {
295 size: stretch::geometry::Size {
296 width: stretch::style::Dimension::Points(100.0),
297 height: stretch::style::Dimension::Points(100.0),
298 },
299 children: vec![stretch::style::Node {
300 position_type: stretch::style::PositionType::Absolute,
301 measure: Some(&|constraint| stretch::geometry::Size {
302 width: constraint.width.or_else(50.0),
303 height: constraint.height.or_else(50.0),
304 }),
305 ..Default::default()
306 }],
307 ..Default::default()
308 });
309
310 assert_eq!(layout.children[0].size.width, 50.0);
311 assert_eq!(layout.children[0].size.height, 50.0);
312 }
313}