malevich 1.18.2

Terminal plotting: a small grammar of marks, honest axes, millions of points
Documentation
use super::Linear;

#[test]
fn map_and_unmap_are_inverses_in_both_range_directions() {
    for range in [(20.0, 80.0), (80.0, 20.0)] {
        let scale = Linear::new((-5.0, 15.0), range);
        for value in [-5.0, 0.0, 7.5, 15.0] {
            let round_trip = scale.unmap(scale.map(value));
            assert!((round_trip - value).abs() < 1e-12);
        }
    }
}

#[test]
fn degenerate_maps_are_stable_and_preserve_gaps() {
    let domain = Linear::new((4.0, 4.0), (0.0, 10.0));
    assert_eq!(domain.map(100.0), 5.0);
    assert!(domain.map(f64::NAN).is_nan());

    let range = Linear::new((2.0, 8.0), (5.0, 5.0));
    assert_eq!(range.unmap(100.0), 5.0);
    assert!(range.unmap(f64::NAN).is_nan());
}

#[test]
fn extreme_finite_endpoints_map_without_non_finite_intermediates() {
    let scale = Linear::new((-f64::MAX, f64::MAX), (0.0, 1.0));
    assert!(scale.finite_affine().is_none());
    assert_eq!(scale.map(-f64::MAX), 0.0);
    assert_eq!(scale.map(0.0), 0.5);
    assert_eq!(scale.map(f64::MAX), 1.0);
    assert_eq!(scale.unmap(0.0), -f64::MAX);
    assert_eq!(scale.unmap(0.5), 0.0);
    assert_eq!(scale.unmap(1.0), f64::MAX);

    let degenerate = Linear::new((1.0, 1.0), (-f64::MAX, f64::MAX));
    assert_eq!(degenerate.map(1.0), 0.0);
}

#[test]
fn ordinary_scales_expose_their_prechecked_affine_map() {
    assert_eq!(
        Linear::new((-5.0, 15.0), (20.0, 80.0)).finite_affine(),
        Some((-5.0, 20.0, 20.0, 60.0))
    );
    assert!(
        Linear::new((1.0, 1.0), (0.0, 10.0))
            .finite_affine()
            .is_none()
    );
}