use fibre_ioc::{global, resolve};
use std::sync::Arc;
trait Greeter: Send + Sync {
fn greet(&self) -> String;
}
struct EnglishGreeter;
impl Greeter for EnglishGreeter {
fn greet(&self) -> String {
"Hello!".to_string()
}
}
#[derive(Debug, PartialEq, Eq)]
struct SimpleService {
id: u32,
}
#[test]
fn test_unnamed_singleton_factory() {
global().add_singleton(|| SimpleService { id: 101 });
let r1 = resolve!(SimpleService);
let r2 = resolve!(SimpleService);
assert_eq!(r1.id, 101);
assert!(Arc::ptr_eq(&r1, &r2));
}
#[test]
fn test_named_singleton_instance() {
let instance = SimpleService { id: 202 };
global().add_instance_with_name("named_instance", instance);
let r1 = resolve!(SimpleService, "named_instance");
let r2 = resolve!(SimpleService, "named_instance");
assert_eq!(r1.id, 202);
assert!(Arc::ptr_eq(&r1, &r2));
}
#[test]
fn test_unnamed_transient_factory() {
struct TransientService {
id: u32,
}
global().add_transient(|| TransientService { id: 303 });
let r1 = resolve!(TransientService);
let r2 = resolve!(TransientService);
assert_eq!(r1.id, 303);
assert_eq!(r2.id, 303);
assert!(!Arc::ptr_eq(&r1, &r2));
}
#[test]
fn test_unnamed_trait_resolution() {
global().add_singleton_trait::<dyn Greeter>(|| Arc::new(EnglishGreeter));
let greeter = resolve!(trait Greeter);
assert_eq!(greeter.greet(), "Hello!");
}
#[test]
fn test_named_trait_resolution() {
struct GermanGreeter;
impl Greeter for GermanGreeter {
fn greet(&self) -> String {
"Hallo!".to_string()
}
}
global().add_singleton_trait_with_name::<dyn Greeter>("german", || Arc::new(GermanGreeter));
let greeter = resolve!(trait Greeter, "german");
assert_eq!(greeter.greet(), "Hallo!");
}
#[test]
#[should_panic(expected = "Failed to resolve required service")]
fn test_resolve_panics_on_missing_concrete_service() {
struct MissingService;
resolve!(MissingService);
}
#[test]
#[should_panic(expected = "Failed to resolve required trait service")]
fn test_resolve_panics_on_missing_trait_service() {
trait MissingTrait: Send + Sync {}
resolve!(trait MissingTrait);
}