tenferro-runtime 0.9.0

Concrete tensor helpers, traced tensors, graph execution, and extension runtime support for tenferro.
Documentation
use std::fmt::Debug;
use std::hash::Hash;
use std::num::NonZeroU64;

use super::super::{
    IdentityKind, ProviderDeviceIdentity, ProviderId, RegistrationIdentity, RuntimeEpoch, RuntimeId,
};

#[test]
fn opaque_nonzero_ids_round_trip_only_inside_the_crate() {
    let runtime_id = RuntimeId::from_nonzero(NonZeroU64::new(7).unwrap());
    let epoch = RuntimeEpoch::from_nonzero(NonZeroU64::new(11).unwrap());

    assert_eq!(runtime_id.get(), NonZeroU64::new(7).unwrap());
    assert_eq!(epoch.get(), NonZeroU64::new(11).unwrap());
    assert_eq!(RuntimeEpoch::one().get(), NonZeroU64::MIN);
}

#[test]
fn runtime_epoch_checked_next_stops_at_nonzero_max() {
    let epoch = RuntimeEpoch::from_nonzero(NonZeroU64::new(41).unwrap());
    let maximum = RuntimeEpoch::from_nonzero(NonZeroU64::MAX);

    assert_eq!(
        epoch.checked_next().unwrap().get(),
        NonZeroU64::new(42).unwrap()
    );
    assert_eq!(maximum.checked_next(), None);
}

#[test]
fn registration_debug_exposes_ordinal_and_never_issuer() {
    let identity =
        RegistrationIdentity::new(NonZeroU64::new(101).unwrap(), NonZeroU64::new(202).unwrap());
    let debug = format!("{identity:?}");

    assert_eq!(identity.ordinal(), NonZeroU64::new(202).unwrap());
    assert!(debug.contains("RegistrationIdentity"));
    assert!(debug.contains("202"));
    assert!(!debug.contains("101"));
    assert!(!debug.contains("issuer"));
}

#[test]
fn provider_device_identity_validates_and_is_ordered_and_hashable() {
    fn assert_runtime_control_plane_traits<T: Clone + Debug + Eq + Hash + Ord>() {}

    assert_runtime_control_plane_traits::<ProviderId>();
    assert_runtime_control_plane_traits::<ProviderDeviceIdentity>();

    let provider = ProviderId::new("tenferro.test.provider").unwrap();
    let first = ProviderDeviceIdentity::new(provider.clone(), "device-a").unwrap();
    let second = ProviderDeviceIdentity::new(provider.clone(), "device-b").unwrap();

    assert_eq!(first.provider_id(), &provider);
    assert_eq!(first.target_identity(), "device-a");
    assert!(first < second);
    assert_ne!(
        first,
        ProviderDeviceIdentity::new(provider, "device-a/other").unwrap()
    );
    assert_eq!(
        ProviderId::new("not-namespaced").unwrap_err().kind(),
        IdentityKind::Provider
    );
    assert_eq!(
        ProviderDeviceIdentity::new(ProviderId::new("tenferro.test.provider").unwrap(), "",)
            .unwrap_err()
            .kind(),
        IdentityKind::ProviderTarget
    );
    for target in [
        "device 0",
        "device\n0",
        "device\t0",
        "device\u{200b}0",
        "デバイス-0",
    ] {
        assert_eq!(
            ProviderDeviceIdentity::new(
                ProviderId::new("tenferro.test.provider").unwrap(),
                target,
            )
            .unwrap_err()
            .kind(),
            IdentityKind::ProviderTarget,
            "target {target:?} must remain diagnostic-safe"
        );
    }
}