Skip to main content

plotlars_core/faceting/
mod.rs

1#[doc(hidden)]
2pub fn calculate_grid_dimensions(
3    n_facets: usize,
4    cols: Option<usize>,
5    rows: Option<usize>,
6) -> (usize, usize) {
7    match (cols, rows) {
8        (Some(c), Some(r)) => {
9            if c * r < n_facets {
10                panic!("Grid dimensions {}x{} cannot fit {} facets", c, r, n_facets);
11            }
12            (c, r)
13        }
14        (Some(c), None) => {
15            let r = n_facets.div_ceil(c);
16            (c, r)
17        }
18        (None, Some(r)) => {
19            let c = n_facets.div_ceil(r);
20            (c, r)
21        }
22        (None, None) => {
23            let c = (n_facets as f64).sqrt().ceil() as usize;
24            let r = n_facets.div_ceil(c);
25            (c, r)
26        }
27    }
28}
29
30pub(crate) fn get_axis_reference(subplot_index: usize, axis_type: &str) -> String {
31    if subplot_index == 0 {
32        axis_type.to_string()
33    } else {
34        format!("{}{}", axis_type, subplot_index + 1)
35    }
36}
37
38#[cfg(test)]
39mod tests {
40    use super::*;
41
42    #[test]
43    fn test_grid_both_exact() {
44        assert_eq!(calculate_grid_dimensions(4, Some(2), Some(2)), (2, 2));
45    }
46
47    #[test]
48    fn test_grid_both_extra() {
49        assert_eq!(calculate_grid_dimensions(3, Some(2), Some(2)), (2, 2));
50    }
51
52    #[test]
53    #[should_panic(expected = "cannot fit")]
54    fn test_grid_both_too_small() {
55        calculate_grid_dimensions(5, Some(2), Some(2));
56    }
57
58    #[test]
59    fn test_grid_cols_only() {
60        assert_eq!(calculate_grid_dimensions(5, Some(3), None), (3, 2));
61    }
62
63    #[test]
64    fn test_grid_rows_only() {
65        assert_eq!(calculate_grid_dimensions(5, None, Some(2)), (3, 2));
66    }
67
68    #[test]
69    fn test_grid_auto_1() {
70        assert_eq!(calculate_grid_dimensions(1, None, None), (1, 1));
71    }
72
73    #[test]
74    fn test_grid_auto_4() {
75        assert_eq!(calculate_grid_dimensions(4, None, None), (2, 2));
76    }
77
78    #[test]
79    fn test_grid_auto_5() {
80        assert_eq!(calculate_grid_dimensions(5, None, None), (3, 2));
81    }
82
83    #[test]
84    fn test_grid_auto_9() {
85        assert_eq!(calculate_grid_dimensions(9, None, None), (3, 3));
86    }
87
88    #[test]
89    fn test_axis_ref_index_zero() {
90        assert_eq!(get_axis_reference(0, "x"), "x");
91    }
92
93    #[test]
94    fn test_axis_ref_index_one() {
95        assert_eq!(get_axis_reference(1, "x"), "x2");
96    }
97
98    #[test]
99    fn test_axis_ref_index_seven() {
100        assert_eq!(get_axis_reference(7, "y"), "y8");
101    }
102}