unit-intervals 0.1.0

Constrained f32/f64 wrapper types for normalized [0, 1] and [-1, 1] values.
Documentation
#![cfg(feature = "bytemuck")]

use bytemuck::{CheckedBitPattern, Zeroable};
use unit_intervals::{SignedUnitInterval, UnitInterval};

#[test]
fn unit_interval_is_zeroable() {
    let value = UnitInterval::<f32>::zeroed();

    assert_eq!(value, UnitInterval::ZERO);
}

#[test]
fn signed_unit_interval_is_zeroable() {
    let value = SignedUnitInterval::<f32>::zeroed();

    assert_eq!(value, SignedUnitInterval::ZERO);
}

#[test]
fn unit_interval_checked_bit_pattern_accepts_only_valid_values() {
    assert!(UnitInterval::<f32>::is_valid_bit_pattern(&0.25));
    assert!(UnitInterval::<f64>::is_valid_bit_pattern(&1.0));
    assert!(!UnitInterval::<f32>::is_valid_bit_pattern(&-0.25));
    assert!(!UnitInterval::<f32>::is_valid_bit_pattern(&1.25));
    assert!(!UnitInterval::<f32>::is_valid_bit_pattern(&f32::NAN));
}

#[test]
fn signed_unit_interval_checked_bit_pattern_accepts_only_valid_values() {
    assert!(SignedUnitInterval::<f32>::is_valid_bit_pattern(&-0.25));
    assert!(SignedUnitInterval::<f64>::is_valid_bit_pattern(&1.0));
    assert!(!SignedUnitInterval::<f32>::is_valid_bit_pattern(&-1.25));
    assert!(!SignedUnitInterval::<f32>::is_valid_bit_pattern(&1.25));
    assert!(!SignedUnitInterval::<f32>::is_valid_bit_pattern(&f32::NAN));
}

#[test]
fn checked_casts_reject_invalid_bytes() {
    let valid = bytemuck::bytes_of(&0.25f32);
    let invalid = bytemuck::bytes_of(&1.25f32);

    assert_eq!(
        bytemuck::checked::try_from_bytes::<UnitInterval<f32>>(valid).copied(),
        Ok(UnitInterval::new(0.25).unwrap())
    );
    assert!(bytemuck::checked::try_from_bytes::<UnitInterval<f32>>(invalid).is_err());
}