minfac 0.1.5

Lightweight Inversion Of Control
Documentation
use minfac::{self, AllRegistered, BuildError, Registered, ServiceCollection};

#[test]
fn handle_cyclic_references() {
    let mut col = ServiceCollection::new();
    col.with::<Registered<i64>>().register(|_| 0i16);
    col.with::<Registered<i16>>().register(|_| 0i32);
    col.with::<Registered<i32>>().register(|_| 0i64);

    let err = col.build().expect_err("Expected to return error");
    let msg = match err {
        BuildError::CyclicDependency { description, .. } => description,
        _ => panic!("Expected BuildError::CyclicDependency"),
    };
    assert!(msg.contains("i32 -> i16"));
    assert!(msg.contains("i16 -> i64"));
    assert!(msg.contains("i64 -> i32"));
}

#[test]
fn one_of_multiple_dependencies_asks_for_dependent_should_trigger_cyclic_dependency() {
    let mut col = ServiceCollection::new();
    col.register(|| 0i32);
    col.with::<Registered<i64>>().register(|_| 1i32);
    col.register(|| 2i32);

    col.with::<AllRegistered<i32>>().register(|_| 42i64);
    let error = col.build().expect_err("Expected to return error");
    let msg = if let BuildError::CyclicDependency { description, .. } = error {
        description
    } else {
        panic!("Expected error");
    };

    assert!(msg.contains("-> minfac::service_provider::ServiceIterator<i32"));
    assert!(msg.contains("-> i64"));
}

#[test]
fn service_a_depends_on_other_which_has_reference_to_typeof_a_but_a_is_not_last_registered() {
    let mut col = ServiceCollection::new();
    col.with::<Registered<i32>>().register(|_| 0i64);
    col.with::<Registered<i64>>().register(|_| 1i32);
    col.register(|| 2i32);

    col.build()
        .expect("Expecting constellation to be resolvable");
}

#[test]
fn only_second_depend() {
    let mut col = ServiceCollection::new();
    col.with::<(Registered<u8>, Registered<i32>)>()
        .register(|_| 0i64);
    col.with::<(Registered<u8>, Registered<i64>)>()
        .register(|_| 1i32);
    col.register(|| 42u8);
    col.build()
        .expect_err("Expecting constellation not to be resolvable");
}

#[test]
fn depend_on_itself() {
    let mut col = ServiceCollection::new();
    col.register_with((|Registered(x): Registered<i32>| x) as fn(_) -> _);
    match col.build() {
        Err(BuildError::CyclicDependency { description, .. }) => {
            assert_eq!("i32 -> i32", description);
        }
        e => panic!("Unexpected result {e:?}"),
    }
}