gioser

tawasuyu/taffy

A high performance rust-powered UI layout library

Rust 499HTML 238Markdown 7TOML 41214 Definiciones

⎇ aae72df2cf794339896b4107bfa3879014b1815f tests/measure.rs Rust · 313 líneas · 11.9 KB Historia Quién tocó qué crudo

cargo fmt aae72df2c · Emil Sjölander ·

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}