1use embedded_graphics::geometry::{Point, Size};
2use embedded_graphics::primitives::Rectangle;
3
4pub trait RectangleExt {
6 fn left_half(&self) -> Self;
8
9 fn left_of(&self, other: &Self) -> Self;
11
12 fn right_of(&self, other: &Self) -> Self;
14
15 fn above(&self, other: &Self) -> Self;
17
18 fn below(&self, other: &Self) -> Self;
20
21 fn y_extend(&self, top: i32, bottom: i32) -> Self;
24
25 fn y_reduce(&self, top: i32, bottom: i32) -> Self;
28
29 fn indent_to(&self, right: i32) -> Self;
32}
33
34impl RectangleExt for Rectangle {
35 fn left_half(&self) -> Self {
36 let width = self.size.width.checked_div(2).unwrap_or_default();
37 let top_left = self.top_left;
38 let size = Size::new(width, self.size.height);
39
40 Self { top_left, size }
41 }
42
43 fn left_of(&self, other: &Self) -> Self {
44 let top_left = self.top_left;
45 let width = other.top_left.x.saturating_sub(self.top_left.x);
46 let width = width.try_into().unwrap_or_default();
47 let size = Size::new(width, self.size.height);
48 let size = self.size.component_min(size);
49
50 Self { top_left, size }
51 }
52
53 fn right_of(&self, other: &Self) -> Self {
54 let right = other.top_left.x.saturating_add_unsigned(other.size.width);
55 let top_left = Point::new(right, self.top_left.y);
56 let top_left = self.top_left.component_max(top_left);
57 let width = right.saturating_sub(self.top_left.x);
58 let width = width.try_into().unwrap_or_default();
59 let size = Size::new(width, Default::default());
60 let size = self.size.saturating_sub(size);
61
62 Self { top_left, size }
63 }
64
65 fn above(&self, other: &Self) -> Self {
66 let top_left = self.top_left;
67 let height = other.top_left.y.saturating_sub(self.top_left.y);
68 let height = height.try_into().unwrap_or_default();
69 let size = Size::new(self.size.width, height);
70 let size = self.size.component_min(size);
71
72 Self { top_left, size }
73 }
74
75 fn below(&self, other: &Self) -> Self {
76 let bottom = other.top_left.y.saturating_add_unsigned(other.size.height);
77 let top_left = Point::new(self.top_left.x, bottom);
78 let top_left = self.top_left.component_max(top_left);
79 let height = bottom.saturating_sub(self.top_left.y);
80 let height = height.try_into().unwrap_or_default();
81 let size = Size::new(Default::default(), height);
82 let size = self.size.saturating_sub(size);
83
84 Self { top_left, size }
85 }
86
87 fn y_extend(&self, top: i32, bottom: i32) -> Self {
88 let extent = self.top_left.y.saturating_sub(top);
89 let extent = extent.try_into().unwrap_or_default();
90 let new_size = Size::new(Default::default(), extent);
91 let new_size = self.size.saturating_add(new_size);
92 let top_left = Point::new(self.top_left.x, top);
93 let top_left = self.top_left.component_min(top_left);
94 let height = bottom.saturating_sub(top_left.y);
95 let height = height.try_into().unwrap_or_default();
96 let size = Size::new(Default::default(), height);
97 let size = new_size.component_max(size);
98
99 Self { top_left, size }
100 }
101
102 fn y_reduce(&self, top: i32, bottom: i32) -> Self {
103 let extent = top.saturating_sub(self.top_left.y);
104 let extent = extent.try_into().unwrap_or_default();
105 let new_size = Size::new(Default::default(), extent);
106 let new_size = self.size.saturating_sub(new_size);
107 let top_left = Point::new(self.top_left.x, top);
108 let top_left = self.top_left.component_max(top_left);
109 let height = bottom.saturating_sub(top_left.y);
110 let height = height.try_into().unwrap_or_default();
111 let size = Size::new(self.size.width, height);
112 let size = new_size.component_min(size);
113
114 Self { top_left, size }
115 }
116
117 fn indent_to(&self, right: i32) -> Self {
118 let top_left = Point::new(right, self.top_left.y);
119 let top_left = self.top_left.component_max(top_left);
120 let width = right.saturating_sub(self.top_left.x);
121 let width = width.try_into().unwrap_or_default();
122 let size = Size::new(width, Default::default());
123 let size = self.size.saturating_sub(size);
124
125 Self { top_left, size }
126 }
127}
128
129#[cfg(test)]
130mod tests {
131 use super::*;
132
133 macro_rules! test_left_half {
134 (
135 $(
136 $fn_ident:ident, $self:expr, $expected:expr,
137 )*
138 ) => {
139 $(
140 #[test]
141 fn $fn_ident() {
142 let result = $self.left_half();
143 assert_eq!(result, $expected);
144 }
145 )*
146 }
147 }
148
149 test_left_half! {
150 left_half_of_1111_2222_3333_4444,
151 Rectangle::new(Point::new(1111, 2222), Size::new(3333, 4444)),
152 Rectangle::new(Point::new(1111, 2222), Size::new(3333 / 2, 4444)),
153
154 left_half_of_0_0_0_0,
155 Rectangle::new(Point::new(0, 0), Size::new(0, 0)),
156 Rectangle::new(Point::new(0, 0), Size::new(0, 0)),
157
158 left_half_of_min_min_max_max,
159 Rectangle::new(Point::new(i32::MIN, i32::MIN), Size::new(u32::MAX, u32::MAX)),
160 Rectangle::new(Point::new(i32::MIN, i32::MIN), Size::new(u32::MAX / 2, u32::MAX)),
161
162 left_half_of_max_max_max_max,
163 Rectangle::new(Point::new(i32::MAX, i32::MAX), Size::new(u32::MAX, u32::MAX)),
164 Rectangle::new(Point::new(i32::MAX, i32::MAX), Size::new(u32::MAX / 2, u32::MAX)),
165 }
166
167 macro_rules! test_left_of {
168 (
169 $(
170 $fn_ident:ident, $self:expr, $other:expr, $expected:expr,
171 )*
172 ) => {
173 $(
174 #[test]
175 fn $fn_ident() {
176 let result = $self.left_of(&$other);
177 assert_eq!(result, $expected);
178 }
179 )*
180 }
181 }
182
183 test_left_of! {
184 left_of_800_for_1111_2222_3333_4444,
185 Rectangle::new(Point::new(1111, 2222), Size::new(3333, 4444)),
186 Rectangle::new(Point::new(800, 2222), Size::new(3333, 4444)),
187 Rectangle::new(Point::new(1111, 2222), Size::new(0, 4444)),
188
189 left_of_1600_for_1111_2222_3333_4444,
190 Rectangle::new(Point::new(1111, 2222), Size::new(3333, 4444)),
191 Rectangle::new(Point::new(1600, 2222), Size::new(3333, 4444)),
192 Rectangle::new(Point::new(1111, 2222), Size::new(1600 - 1111, 4444)),
193
194 left_of_3200_for_1111_2222_3333_4444,
195 Rectangle::new(Point::new(1111, 2222), Size::new(3333, 4444)),
196 Rectangle::new(Point::new(3200, 2222), Size::new(3333, 4444)),
197 Rectangle::new(Point::new(1111, 2222), Size::new(3200 - 1111, 4444)),
198
199 left_of_6400_for_1111_2222_3333_4444,
200 Rectangle::new(Point::new(1111, 2222), Size::new(3333, 4444)),
201 Rectangle::new(Point::new(6400, 2222), Size::new(3333, 4444)),
202 Rectangle::new(Point::new(1111, 2222), Size::new(3333, 4444)),
203
204 left_of_0_for_0_0_0_0,
205 Rectangle::new(Point::new(0, 0), Size::new(0, 0)),
206 Rectangle::new(Point::new(0, 0), Size::new(0, 0)),
207 Rectangle::new(Point::new(0, 0), Size::new(0, 0)),
208
209 left_of_minus_1_for_min_min_max_max,
210 Rectangle::new(Point::new(i32::MIN, i32::MIN), Size::new(u32::MAX, u32::MAX)),
211 Rectangle::new(Point::new(-1, i32::MIN), Size::new(u32::MAX, u32::MAX)),
212 Rectangle::new(Point::new(i32::MIN, i32::MIN), Size::new(u32::MAX / 2, u32::MAX)),
213
214 left_of_minus_1_for_max_max_max_max,
215 Rectangle::new(Point::new(i32::MAX, i32::MAX), Size::new(u32::MAX, u32::MAX)),
216 Rectangle::new(Point::new(-1, i32::MIN), Size::new(u32::MAX, u32::MAX)),
217 Rectangle::new(Point::new(i32::MAX, i32::MAX), Size::new(0, u32::MAX)),
218 }
219
220 macro_rules! test_right_of {
221 (
222 $(
223 $fn_ident:ident, $self:expr, $other:expr, $expected:expr,
224 )*
225 ) => {
226 $(
227 #[test]
228 fn $fn_ident() {
229 let result = $self.right_of(&$other);
230 assert_eq!(result, $expected);
231 }
232 )*
233 }
234 }
235
236 test_right_of! {
237 right_of_800_for_1111_2222_3333_4444,
238 Rectangle::new(Point::new(1111, 2222), Size::new(3333, 4444)),
239 Rectangle::new(Point::new(0, 2222), Size::new(800, 4444)),
240 Rectangle::new(Point::new(1111, 2222), Size::new(3333, 4444)),
241
242 right_of_1600_for_1111_2222_3333_4444,
243 Rectangle::new(Point::new(1111, 2222), Size::new(3333, 4444)),
244 Rectangle::new(Point::new(0, 2222), Size::new(1600, 4444)),
245 Rectangle::new(Point::new(1600, 2222), Size::new(3333 + 1111 - 1600, 4444)),
246
247 right_of_3200_for_1111_2222_3333_4444,
248 Rectangle::new(Point::new(1111, 2222), Size::new(3333, 4444)),
249 Rectangle::new(Point::new(0, 2222), Size::new(3200, 4444)),
250 Rectangle::new(Point::new(3200, 2222), Size::new(3333 + 1111 - 3200, 4444)),
251
252 right_of_6400_for_1111_2222_3333_4444,
253 Rectangle::new(Point::new(1111, 2222), Size::new(3333, 4444)),
254 Rectangle::new(Point::new(0, 2222), Size::new(6400, 4444)),
255 Rectangle::new(Point::new(6400, 2222), Size::new(0, 4444)),
256
257 right_of_0_for_0_0_0_0,
258 Rectangle::new(Point::new(0, 0), Size::new(0, 0)),
259 Rectangle::new(Point::new(0, 0), Size::new(0, 0)),
260 Rectangle::new(Point::new(0, 0), Size::new(0, 0)),
261
262 right_of_minus_1_for_min_min_max_max,
263 Rectangle::new(Point::new(i32::MIN, i32::MIN), Size::new(u32::MAX, u32::MAX)),
264 Rectangle::new(Point::new(i32::MIN, i32::MIN), Size::new(u32::MAX / 2, u32::MAX)),
265 Rectangle::new(Point::new(-1, i32::MIN), Size::new(u32::MAX / 2 + 1, u32::MAX)),
266
267 right_of_minus_1_for_max_max_max_max,
268 Rectangle::new(Point::new(i32::MAX, i32::MAX), Size::new(u32::MAX, u32::MAX)),
269 Rectangle::new(Point::new(i32::MIN, i32::MIN), Size::new(u32::MAX / 2, u32::MAX)),
270 Rectangle::new(Point::new(i32::MAX, i32::MAX), Size::new(u32::MAX, u32::MAX)),
271 }
272
273 macro_rules! test_above {
274 (
275 $(
276 $fn_ident:ident, $self:expr, $other:expr, $expected:expr,
277 )*
278 ) => {
279 $(
280 #[test]
281 fn $fn_ident() {
282 let result = $self.above(&$other);
283 assert_eq!(result, $expected);
284 }
285 )*
286 }
287 }
288
289 test_above! {
290 above_800_for_1111_2222_3333_4444,
291 Rectangle::new(Point::new(1111, 2222), Size::new(3333, 4444)),
292 Rectangle::new(Point::new(2222, 800), Size::new(3333, 4444)),
293 Rectangle::new(Point::new(1111, 2222), Size::new(3333, 0)),
294
295 above_1600_for_1111_2222_3333_4444,
296 Rectangle::new(Point::new(1111, 2222), Size::new(3333, 4444)),
297 Rectangle::new(Point::new(2222, 1600), Size::new(3333, 4444)),
298 Rectangle::new(Point::new(1111, 2222), Size::new(3333, 0)),
299
300 above_3200_for_1111_2222_3333_4444,
301 Rectangle::new(Point::new(1111, 2222), Size::new(3333, 4444)),
302 Rectangle::new(Point::new(1111, 3200), Size::new(3333, 4444)),
303 Rectangle::new(Point::new(1111, 2222), Size::new(3333, 3200 - 2222)),
304
305 above_6400_for_1111_2222_3333_4444,
306 Rectangle::new(Point::new(1111, 2222), Size::new(3333, 4444)),
307 Rectangle::new(Point::new(1111, 6400), Size::new(3333, 4444)),
308 Rectangle::new(Point::new(1111, 2222), Size::new(3333, 6400 - 2222)),
309
310 above_0_for_0_0_0_0,
311 Rectangle::new(Point::new(0, 0), Size::new(0, 0)),
312 Rectangle::new(Point::new(0, 0), Size::new(0, 0)),
313 Rectangle::new(Point::new(0, 0), Size::new(0, 0)),
314
315 above_minus_1_for_min_min_max_max,
316 Rectangle::new(Point::new(i32::MIN, i32::MIN), Size::new(u32::MAX, u32::MAX)),
317 Rectangle::new(Point::new(i32::MIN, -1), Size::new(u32::MAX, u32::MAX)),
318 Rectangle::new(Point::new(i32::MIN, i32::MIN), Size::new(u32::MAX, u32::MAX / 2)),
319
320 above_minus_1_for_max_max_max_max,
321 Rectangle::new(Point::new(i32::MAX, i32::MAX), Size::new(u32::MAX, u32::MAX)),
322 Rectangle::new(Point::new(i32::MIN, -1), Size::new(u32::MAX, u32::MAX)),
323 Rectangle::new(Point::new(i32::MAX, i32::MAX), Size::new(u32::MAX, 0)),
324 }
325
326 macro_rules! test_below {
327 (
328 $(
329 $fn_ident:ident, $self:expr, $other:expr, $expected:expr,
330 )*
331 ) => {
332 $(
333 #[test]
334 fn $fn_ident() {
335 let result = $self.below(&$other);
336 assert_eq!(result, $expected);
337 }
338 )*
339 }
340 }
341
342 test_below! {
343 below_800_for_1111_2222_3333_4444,
344 Rectangle::new(Point::new(1111, 2222), Size::new(3333, 4444)),
345 Rectangle::new(Point::new(1111, 0), Size::new(3333, 800)),
346 Rectangle::new(Point::new(1111, 2222), Size::new(3333, 4444)),
347
348 below_1600_for_1111_2222_3333_4444,
349 Rectangle::new(Point::new(1111, 2222), Size::new(3333, 4444)),
350 Rectangle::new(Point::new(1111, 0), Size::new(3333, 1600)),
351 Rectangle::new(Point::new(1111, 2222), Size::new(3333, 4444)),
352
353 below_3200_for_1111_2222_3333_4444,
354 Rectangle::new(Point::new(1111, 2222), Size::new(3333, 4444)),
355 Rectangle::new(Point::new(1111, 0), Size::new(3333, 3200)),
356 Rectangle::new(Point::new(1111, 3200), Size::new(3333, 4444 + 2222 - 3200)),
357
358 below_6400_for_1111_2222_3333_4444,
359 Rectangle::new(Point::new(1111, 2222), Size::new(3333, 4444)),
360 Rectangle::new(Point::new(1111, 0), Size::new(3333, 6400)),
361 Rectangle::new(Point::new(1111, 6400), Size::new(3333, 4444 + 2222 - 6400)),
362
363 below_0_for_0_0_0_0,
364 Rectangle::new(Point::new(0, 0), Size::new(0, 0)),
365 Rectangle::new(Point::new(0, 0), Size::new(0, 0)),
366 Rectangle::new(Point::new(0, 0), Size::new(0, 0)),
367
368 below_minus_1_for_min_min_max_max,
369 Rectangle::new(Point::new(i32::MIN, i32::MIN), Size::new(u32::MAX, u32::MAX)),
370 Rectangle::new(Point::new(i32::MIN, i32::MIN), Size::new(u32::MAX, u32::MAX / 2)),
371 Rectangle::new(Point::new(i32::MIN, -1), Size::new(u32::MAX, u32::MAX / 2 + 1)),
372
373 below_minus_1_for_max_max_max_max,
374 Rectangle::new(Point::new(i32::MAX, i32::MAX), Size::new(u32::MAX, u32::MAX)),
375 Rectangle::new(Point::new(i32::MIN, i32::MIN), Size::new(u32::MAX, u32::MAX / 2)),
376 Rectangle::new(Point::new(i32::MAX, i32::MAX), Size::new(u32::MAX, u32::MAX)),
377 }
378
379 macro_rules! test_y_extend {
380 (
381 $(
382 $fn_ident:ident, $self:expr, $top:expr, $bottom:expr, $expected:expr,
383 )*
384 ) => {
385 $(
386 #[test]
387 fn $fn_ident() {
388 let result = $self.y_extend($top, $bottom);
389 assert_eq!(result, $expected);
390 }
391 )*
392 }
393 }
394
395 test_y_extend! {
396 y_extend_top_to_0_for_1111_2222_3333_4444,
397 Rectangle::new(Point::new(1111, 2222), Size::new(3333, 4444)),
398 0, 4444 + 2222,
399 Rectangle::new(Point::new(1111, 0), Size::new(3333, 4444 + 2222)),
400
401 y_extend_top_to_1600_for_1111_2222_3333_4444,
402 Rectangle::new(Point::new(1111, 2222), Size::new(3333, 4444)),
403 1600, 4444 + 2222 - 1600,
404 Rectangle::new(Point::new(1111, 1600), Size::new(3333, 4444 + 2222 - 1600)),
405
406 y_extend_bottom_to_3200_for_1111_2222_3333_4444,
407 Rectangle::new(Point::new(1111, 2222), Size::new(3333, 4444)),
408 2222, 3200,
409 Rectangle::new(Point::new(1111, 2222), Size::new(3333, 4444)),
410
411 y_extend_bottom_to_6400_for_1111_2222_3333_4444,
412 Rectangle::new(Point::new(1111, 2222), Size::new(3333, 4444)),
413 2222, 6400,
414 Rectangle::new(Point::new(1111, 2222), Size::new(3333, 4444)),
415
416 y_extend_bottom_to_12800_for_1111_2222_3333_4444,
417 Rectangle::new(Point::new(1111, 2222), Size::new(3333, 4444)),
418 2222, 12800,
419 Rectangle::new(Point::new(1111, 2222), Size::new(3333, 12800 - 2222)),
420
421 y_extend_top_to_0_and_bottom_to_25600_for_1111_2222_3333_4444,
422 Rectangle::new(Point::new(1111, 2222), Size::new(3333, 4444)),
423 0, 25600,
424 Rectangle::new(Point::new(1111, 0), Size::new(3333, 25600)),
425
426 y_extend_top_to_25600_and_bottom_to_0_for_1111_2222_3333_4444,
427 Rectangle::new(Point::new(1111, 2222), Size::new(3333, 4444)),
428 25600, 0,
429 Rectangle::new(Point::new(1111, 2222), Size::new(3333, 4444)),
430
431 y_extend_top_to_half_min_and_bottom_to_half_max_for_1111_2222_3333_4444,
432 Rectangle::new(Point::new(1111, 2222), Size::new(3333, 4444)),
433 i32::MIN / 2, i32::MAX / 2,
434 Rectangle::new(Point::new(1111, i32::MIN / 2), Size::new(3333, u32::MAX / 2)),
435
436 y_extend_top_to_0_and_bottom_to_max_for_1111_2222_3333_4444,
437 Rectangle::new(Point::new(1111, 2222), Size::new(3333, 4444)),
438 0, i32::MAX,
439 Rectangle::new(Point::new(1111, 0), Size::new(3333, u32::MAX / 2)),
440
441 y_extend_top_to_max_and_bottom_to_max_for_1111_2222_3333_4444,
442 Rectangle::new(Point::new(1111, 2222), Size::new(3333, 4444)),
443 i32::MAX, i32::MAX,
444 Rectangle::new(Point::new(1111, 2222), Size::new(3333, u32::MAX / 2 - 2222)),
445 }
446
447 macro_rules! test_y_reduce {
448 (
449 $(
450 $fn_ident:ident, $self:expr, $top:expr, $bottom:expr, $expected:expr,
451 )*
452 ) => {
453 $(
454 #[test]
455 fn $fn_ident() {
456 let result = $self.y_reduce($top, $bottom);
457 assert_eq!(result, $expected);
458 }
459 )*
460 }
461 }
462
463 test_y_reduce! {
464 y_reduce_top_to_0_for_1111_2222_3333_4444,
465 Rectangle::new(Point::new(1111, 2222), Size::new(3333, 4444)),
466 0, 4444 + 2222,
467 Rectangle::new(Point::new(1111, 2222), Size::new(3333, 4444)),
468
469 y_reduce_top_to_1600_for_1111_2222_3333_4444,
470 Rectangle::new(Point::new(1111, 2222), Size::new(3333, 4444)),
471 1600, 4444 + 2222,
472 Rectangle::new(Point::new(1111, 2222), Size::new(3333, 4444)),
473
474 y_reduce_top_to_3200_for_1111_2222_3333_4444,
475 Rectangle::new(Point::new(1111, 2222), Size::new(3333, 4444)),
476 3200, 4444 + 2222,
477 Rectangle::new(Point::new(1111, 3200), Size::new(3333, 4444 + 2222 - 3200)),
478
479 y_reduce_top_to_6400_for_1111_2222_3333_4444,
480 Rectangle::new(Point::new(1111, 2222), Size::new(3333, 4444)),
481 6400, 4444 + 2222,
482 Rectangle::new(Point::new(1111, 6400), Size::new(3333, 4444 + 2222 - 6400)),
483
484 y_reduce_bottom_to_3200_for_1111_2222_3333_4444,
485 Rectangle::new(Point::new(1111, 2222), Size::new(3333, 4444)),
486 2222, 3200,
487 Rectangle::new(Point::new(1111, 2222), Size::new(3333, 3200 - 2222)),
488
489 y_reduce_bottom_to_6400_for_1111_2222_3333_4444,
490 Rectangle::new(Point::new(1111, 2222), Size::new(3333, 4444)),
491 2222, 6400,
492 Rectangle::new(Point::new(1111, 2222), Size::new(3333, 6400 - 2222)),
493
494 y_reduce_bottom_to_12800_for_1111_2222_3333_4444,
495 Rectangle::new(Point::new(1111, 2222), Size::new(3333, 4444)),
496 2222, 12800,
497 Rectangle::new(Point::new(1111, 2222), Size::new(3333, 4444)),
498
499 y_reduce_top_to_1600_and_bottom_to_6400_for_1111_2222_3333_4444,
500 Rectangle::new(Point::new(1111, 2222), Size::new(3333, 4444)),
501 1600, 3200,
502 Rectangle::new(Point::new(1111, 2222), Size::new(3333, 3200 - 2222)),
503
504 y_reduce_top_to_3200_and_bottom_to_6400_for_1111_2222_3333_4444,
505 Rectangle::new(Point::new(1111, 2222), Size::new(3333, 4444)),
506 3200, 6400,
507 Rectangle::new(Point::new(1111, 3200), Size::new(3333, 6400 - 3200)),
508
509 y_reduce_top_to_6400_and_bottom_to_12800_for_1111_2222_3333_4444,
510 Rectangle::new(Point::new(1111, 2222), Size::new(3333, 4444)),
511 6400, 12800,
512 Rectangle::new(Point::new(1111, 6400), Size::new(3333, 4444 + 2222 - 6400)),
513
514 y_reduce_top_to_0_and_bottom_to_25600_for_1111_2222_3333_4444,
515 Rectangle::new(Point::new(1111, 2222), Size::new(3333, 4444)),
516 0, 25600,
517 Rectangle::new(Point::new(1111, 2222), Size::new(3333, 4444)),
518
519 y_reduce_top_to_25600_and_bottom_to_0_for_1111_2222_3333_4444,
520 Rectangle::new(Point::new(1111, 2222), Size::new(3333, 4444)),
521 25600, 0,
522 Rectangle::new(Point::new(1111, 25600), Size::new(3333, 0)),
523
524 y_reduce_top_to_max_and_bottom_to_max_for_1111_2222_3333_4444,
525 Rectangle::new(Point::new(1111, 2222), Size::new(3333, 4444)),
526 i32::MAX, i32::MAX,
527 Rectangle::new(Point::new(1111, i32::MAX), Size::new(3333, 0)),
528 }
529
530 macro_rules! test_indent_to {
531 (
532 $(
533 $fn_ident:ident, $self:expr, $right:expr, $expected:expr,
534 )*
535 ) => {
536 $(
537 #[test]
538 fn $fn_ident() {
539 let result = $self.indent_to($right);
540 assert_eq!(result, $expected);
541 }
542 )*
543 }
544 }
545
546 test_indent_to! {
547 indent_to_800_for_1111_2222_3333_4444,
548 Rectangle::new(Point::new(1111, 2222), Size::new(3333, 4444)),
549 800,
550 Rectangle::new(Point::new(1111, 2222), Size::new(3333, 4444)),
551
552 indent_to_1600_for_1111_2222_3333_4444,
553 Rectangle::new(Point::new(1111, 2222), Size::new(3333, 4444)),
554 1600,
555 Rectangle::new(Point::new(1600, 2222), Size::new(3333 + 1111 - 1600, 4444)),
556
557 indent_to_3200_for_1111_2222_3333_4444,
558 Rectangle::new(Point::new(1111, 2222), Size::new(3333, 4444)),
559 3200,
560 Rectangle::new(Point::new(3200, 2222), Size::new(3333 + 1111 - 3200, 4444)),
561
562 indent_to_6400_for_1111_2222_3333_4444,
563 Rectangle::new(Point::new(1111, 2222), Size::new(3333, 4444)),
564 6400,
565 Rectangle::new(Point::new(6400, 2222), Size::new(0, 4444)),
566
567 indent_to_0_for_0_0_0_0,
568 Rectangle::new(Point::new(0, 0), Size::new(0, 0)),
569 0,
570 Rectangle::new(Point::new(0, 0), Size::new(0, 0)),
571
572 indent_to_minus_1_for_min_min_max_max,
573 Rectangle::new(Point::new(i32::MIN, i32::MIN), Size::new(u32::MAX, u32::MAX)),
574 -1,
575 Rectangle::new(Point::new(-1, i32::MIN), Size::new(u32::MAX / 2 + 1, u32::MAX)),
576
577 indent_to_minus_1_for_max_max_max_max,
578 Rectangle::new(Point::new(i32::MAX, i32::MAX), Size::new(u32::MAX, u32::MAX)),
579 -1,
580 Rectangle::new(Point::new(i32::MAX, i32::MAX), Size::new(u32::MAX, u32::MAX)),
581 }
582}