ferrunix 0.5.2

A lightweight run-time dependency injection framework for Rust
Documentation
#![allow(clippy::unwrap_used, clippy::panic, dead_code)]

use ferrunix::{Ref, Registry};

#[test]
#[cfg(not(feature = "tokio"))]
fn simple_child() {
    let registry = Ref::new(Registry::empty());
    registry.register_transient(|| 5_u8);
    registry.register_singleton(|| 5_u16);
    registry.validate_all_full().unwrap();

    let child1 = registry.child();
    child1.register_transient(|| 0_u8);
    child1.validate_all_full().unwrap();

    let child2 = registry.child();
    child2.register_singleton(|| 0_u32);
    child2.validate_all_full().unwrap();

    assert_eq!(registry.transient::<u8>().unwrap(), 5_u8);
    assert_eq!(*registry.singleton::<u16>().unwrap(), 5_u16);

    assert_eq!(child1.transient::<u8>().unwrap(), 0_u8);
    assert_eq!(*child1.singleton::<u16>().unwrap(), 5_u16);

    assert_eq!(child2.transient::<u8>().unwrap(), 5_u8);
    assert_eq!(*child2.singleton::<u16>().unwrap(), 5_u16);
    assert_eq!(*child2.singleton::<u32>().unwrap(), 0_u32);
}

#[tokio::test]
#[cfg(feature = "tokio")]
async fn simple_child_tokio() {
    let registry = Ref::new(Registry::empty());
    registry
        .register_transient(|| Box::pin(async move { 5_u8 }))
        .await;
    registry
        .register_singleton(|| Box::pin(async move { 5_u16 }))
        .await;
    registry.validate_all_full().unwrap();

    let child1 = registry.child();
    child1
        .register_transient(|| Box::pin(async move { 0_u8 }))
        .await;
    child1.validate_all_full().unwrap();

    let child2 = registry.child();
    child2
        .register_singleton(|| Box::pin(async move { 0_u32 }))
        .await;
    child2.validate_all_full().unwrap();

    assert_eq!(registry.transient::<u8>().await.unwrap(), 5_u8);
    assert_eq!(*registry.singleton::<u16>().await.unwrap(), 5_u16);

    assert_eq!(child1.transient::<u8>().await.unwrap(), 0_u8);
    assert_eq!(*child1.singleton::<u16>().await.unwrap(), 5_u16);

    assert_eq!(child2.transient::<u8>().await.unwrap(), 5_u8);
    assert_eq!(*child2.singleton::<u16>().await.unwrap(), 5_u16);
    assert_eq!(*child2.singleton::<u32>().await.unwrap(), 0_u32);
}