plotlars_core/faceting/
mod.rs1#[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}