#![cfg(feature = "items_collections")]
use std::sync::Arc;
use noema::core::{Container, Injectable};
use noema::items_collections::{ItemSet, collection, item};
use noema::{items, resolve};
#[collection(i32, name = "Steps")]
struct Steps;
#[item(Steps, value = 1, name = "one")]
struct StepOne;
#[item(Steps, value = 2, name = "two")]
struct StepTwo;
items!(Steps: [StepOne, StepTwo]);
#[collection(i32, name = "Roles")]
struct Roles;
#[item(Roles, value = 10, name = "admin")]
struct Admin;
items!(Roles: [Admin]);
#[collection(i32, name = "Empty")]
struct Empty;
items!(Empty: []);
#[derive(Injectable)]
struct Workflow {
steps: Arc<ItemSet<Steps>>,
}
#[test]
fn resolve_clone_inject_and_lookup() {
let a = resolve::<ItemSet<Steps>>();
let b = resolve::<ItemSet<Steps>>();
assert!(Arc::ptr_eq(&a, &b));
assert_eq!(a.len(), 2);
assert!(!a.is_empty());
assert_eq!(a[0].name(), "one");
assert_eq!(a[1].name(), "two");
assert_eq!(a.by_name("one").unwrap().value(), 1);
assert_eq!(a.by_value(&2).unwrap().name(), "two");
let wf = Workflow::inject(&Container);
assert!(Arc::ptr_eq(&wf.steps, &a));
}
#[test]
fn empty_collection() {
let empty = resolve::<ItemSet<Empty>>();
assert!(empty.is_empty());
}
#[test]
fn collections_are_isolated() {
let steps = resolve::<ItemSet<Steps>>();
let roles = resolve::<ItemSet<Roles>>();
assert!(steps.by_name("admin").is_none());
assert!(roles.by_name("one").is_none());
assert_eq!(roles.by_name("admin").unwrap().value(), 10);
}