use ironlab::ir::{AxisLink, Dimension, Limits};
use ironlab::prelude::*;
fn groups(fig: &Figure, dim: Dimension) -> Vec<Vec<NodeId>> {
fig.ir()
.links
.iter()
.filter(|link| link.dimension == dim)
.map(|link| {
let mut ids = link.axes.clone();
ids.sort();
ids
})
.collect()
}
fn sorted(mut ids: Vec<NodeId>) -> Vec<NodeId> {
ids.sort();
ids
}
fn four_axes() -> (Figure, [NodeId; 4]) {
let mut fig = Figure::new().tiles(2, 2);
let ids = [
fig.axes(0, 0).id(),
fig.axes(0, 1).id(),
fig.axes(1, 0).id(),
fig.axes(1, 1).id(),
];
(fig, ids)
}
#[test]
fn link_all_x_links_every_axes_along_x_only() {
let (mut fig, ids) = four_axes();
fig.link_all_x().unwrap();
assert_eq!(groups(&fig, Dimension::X), vec![sorted(ids.to_vec())]);
assert!(groups(&fig, Dimension::Y).is_empty());
assert!(groups(&fig, Dimension::Z).is_empty());
}
#[test]
fn link_all_y_links_every_axes_along_y_only() {
let (mut fig, ids) = four_axes();
fig.link_all_y().unwrap();
assert_eq!(groups(&fig, Dimension::Y), vec![sorted(ids.to_vec())]);
assert!(groups(&fig, Dimension::X).is_empty());
}
#[test]
fn link_shortcuts_chain() {
let (mut fig, ids) = four_axes();
fig.link_all_x().unwrap().link_all_y().unwrap();
assert_eq!(groups(&fig, Dimension::X), vec![sorted(ids.to_vec())]);
assert_eq!(groups(&fig, Dimension::Y), vec![sorted(ids.to_vec())]);
}
#[test]
fn link_by_ids_creates_and_merges_groups() {
let (mut fig, [a, b, c, d]) = four_axes();
fig.link(Dim::Y, &[a, b]).unwrap();
fig.link(Dim::X, &[a, c]).unwrap();
assert_eq!(groups(&fig, Dimension::Y), vec![sorted(vec![a, b])]);
assert_eq!(groups(&fig, Dimension::X), vec![sorted(vec![a, c])]);
fig.link(Dim::X, &[c, d]).unwrap();
assert_eq!(groups(&fig, Dimension::X), vec![sorted(vec![a, c, d])]);
}
#[test]
fn link_synchronises_the_group_to_the_first_axes_along_that_dimension_only() {
let (mut fig, [a, b, c, _]) = four_axes();
fig.axes(1, 0).xlim(-5.0, 5.0).ylim(0.0, 1.0);
fig.link(Dim::X, &[c, a, b]).unwrap();
let manual = Limits::Manual {
min: -5.0,
max: 5.0,
};
for id in [a, b, c] {
assert_eq!(fig.ir().axes(id).unwrap().x.limits, manual);
}
assert_eq!(fig.ir().axes(a).unwrap().y.limits, Limits::Auto);
}
#[test]
fn link_with_an_unknown_id_is_an_error_and_changes_nothing() {
let (mut fig, [a, b, ..]) = four_axes();
fig.link(Dim::X, &[a, b]).unwrap();
let before: Vec<AxisLink> = fig.ir().links.clone();
let result = fig.link(Dim::X, &[a, NodeId(9_999)]);
assert!(matches!(result, Err(Error::Ir(_))), "{result:?}");
assert_eq!(fig.ir().links, before);
}
#[test]
fn link_chains_on_success() -> Result<(), Error> {
let (mut fig, [a, b, c, d]) = four_axes();
fig.link(Dim::X, &[a, b])?.link(Dim::Y, &[c, d])?;
assert_eq!(fig.ir().links.len(), 2);
Ok(())
}