diff options
| author | HampusM <hampus@hampusmat.com> | 2022-10-09 20:41:09 +0200 | 
|---|---|---|
| committer | HampusM <hampus@hampusmat.com> | 2022-10-09 20:42:07 +0200 | 
| commit | fd5b6786d29d056ff0721a59435b50005f13f05c (patch) | |
| tree | 3839ff2ffa99a14d1aefb952a55f1cb05aa0f09e /src | |
| parent | 5b0c6a52022e67a2d9cee251b3d08b9cb2b5f6cb (diff) | |
test: add more unit tests
Diffstat (limited to 'src')
| -rw-r--r-- | src/castable_factory/blocking.rs | 23 | ||||
| -rw-r--r-- | src/castable_factory/threadsafe.rs | 24 | ||||
| -rw-r--r-- | src/di_container/binding_map.rs | 201 | ||||
| -rw-r--r-- | src/lib.rs | 3 | 
4 files changed, 251 insertions, 0 deletions
| diff --git a/src/castable_factory/blocking.rs b/src/castable_factory/blocking.rs index 5ff4db0..5dc12e5 100644 --- a/src/castable_factory/blocking.rs +++ b/src/castable_factory/blocking.rs @@ -72,3 +72,26 @@ where      ReturnInterface: 'static + ?Sized,  {  } + +#[cfg(test)] +mod tests +{ +    use super::*; + +    #[test] +    fn can_call() +    { +        #[derive(Debug, PartialEq, Eq)] +        struct Bacon +        { +            heal_amount: u32, +        } + +        let castable_factory = +            CastableFactory::new(&|heal_amount| TransientPtr::new(Bacon { heal_amount })); + +        let output = castable_factory(27); + +        assert_eq!(output, Box::new(Bacon { heal_amount: 27 })); +    } +} diff --git a/src/castable_factory/threadsafe.rs b/src/castable_factory/threadsafe.rs index 08c5ecf..84e15b9 100644 --- a/src/castable_factory/threadsafe.rs +++ b/src/castable_factory/threadsafe.rs @@ -85,3 +85,27 @@ where      ReturnInterface: 'static + ?Sized,  {  } + +#[cfg(test)] +mod tests +{ +    use super::*; + +    #[test] +    fn can_call() +    { +        #[derive(Debug, PartialEq, Eq)] +        struct Bacon +        { +            heal_amount: u32, +        } + +        let castable_factory = ThreadsafeCastableFactory::new(&|heal_amount| { +            TransientPtr::new(Bacon { heal_amount }) +        }); + +        let output = castable_factory(27); + +        assert_eq!(output, Box::new(Bacon { heal_amount: 27 })); +    } +} diff --git a/src/di_container/binding_map.rs b/src/di_container/binding_map.rs index eb71ff7..6ecd34c 100644 --- a/src/di_container/binding_map.rs +++ b/src/di_container/binding_map.rs @@ -89,3 +89,204 @@ where          self.bindings.len()      }  } + +#[cfg(test)] +mod tests +{ +    use super::*; + +    mod subjects +    { +        pub trait SomeProvider +        { +            fn get_id(&self) -> u8; +        } + +        pub struct SomeProviderImpl +        { +            pub id: u8, +        } + +        impl SomeProvider for SomeProviderImpl +        { +            fn get_id(&self) -> u8 +            { +                self.id +            } +        } +    } + +    #[test] +    fn can_get() +    { +        type Interface = (); + +        let mut binding_map = DIContainerBindingMap::<dyn subjects::SomeProvider>::new(); + +        binding_map.bindings.insert( +            DIContainerBindingKey { +                type_id: TypeId::of::<Interface>(), +                name: None, +            }, +            Box::new(subjects::SomeProviderImpl { id: 20 }), +        ); + +        assert!(binding_map +            .get::<Interface>(None) +            .map_or_else(|| false, |provider| provider.get_id() == 20)); +    } + +    #[test] +    fn can_get_with_name() +    { +        type Interface = (); + +        let mut binding_map = DIContainerBindingMap::<dyn subjects::SomeProvider>::new(); + +        binding_map.bindings.insert( +            DIContainerBindingKey { +                type_id: TypeId::of::<Interface>(), +                name: Some("hello"), +            }, +            Box::new(subjects::SomeProviderImpl { id: 11 }), +        ); + +        assert!(binding_map +            .get::<Interface>(Some("hello")) +            .map_or_else(|| false, |provider| provider.get_id() == 11)); + +        assert!(binding_map.get::<Interface>(None).is_none()); +    } + +    #[test] +    fn can_set() +    { +        type Interface = (); + +        let mut binding_map = DIContainerBindingMap::<dyn subjects::SomeProvider>::new(); + +        binding_map +            .set::<Interface>(None, Box::new(subjects::SomeProviderImpl { id: 65 })); + +        let expected_key = &DIContainerBindingKey { +            type_id: TypeId::of::<Interface>(), +            name: None, +        }; + +        assert!(binding_map.bindings.contains_key(expected_key)); + +        assert_eq!(binding_map.bindings[expected_key].get_id(), 65); +    } + +    #[test] +    fn can_set_with_name() +    { +        type Interface = (); + +        let mut binding_map = DIContainerBindingMap::<dyn subjects::SomeProvider>::new(); + +        binding_map.set::<Interface>( +            Some("special"), +            Box::new(subjects::SomeProviderImpl { id: 3 }), +        ); + +        let expected_key = &DIContainerBindingKey { +            type_id: TypeId::of::<Interface>(), +            name: Some("special"), +        }; + +        assert!(binding_map.bindings.contains_key(expected_key)); + +        assert_eq!(binding_map.bindings[expected_key].get_id(), 3); +    } + +    #[test] +    fn can_remove() +    { +        type Interface = (); + +        let mut binding_map = DIContainerBindingMap::<dyn subjects::SomeProvider>::new(); + +        binding_map.bindings.insert( +            DIContainerBindingKey { +                type_id: TypeId::of::<Interface>(), +                name: None, +            }, +            Box::new(subjects::SomeProviderImpl { id: 103 }), +        ); + +        binding_map.remove::<Interface>(None); + +        let expected_key = &DIContainerBindingKey { +            type_id: TypeId::of::<Interface>(), +            name: None, +        }; + +        assert!(!binding_map.bindings.contains_key(expected_key)); +    } + +    #[test] +    fn can_remove_with_name() +    { +        type Interface = (); + +        let mut binding_map = DIContainerBindingMap::<dyn subjects::SomeProvider>::new(); + +        binding_map.bindings.insert( +            DIContainerBindingKey { +                type_id: TypeId::of::<Interface>(), +                name: Some("cool"), +            }, +            Box::new(subjects::SomeProviderImpl { id: 42 }), +        ); + +        binding_map.remove::<Interface>(Some("cool")); + +        let expected_key = &DIContainerBindingKey { +            type_id: TypeId::of::<Interface>(), +            name: Some("cool"), +        }; + +        assert!(!binding_map.bindings.contains_key(expected_key)); +    } + +    #[test] +    fn can_get_has() +    { +        type Interface = (); + +        let mut binding_map = DIContainerBindingMap::<dyn subjects::SomeProvider>::new(); + +        assert!(!binding_map.has::<Interface>(None)); + +        binding_map.bindings.insert( +            DIContainerBindingKey { +                type_id: TypeId::of::<Interface>(), +                name: None, +            }, +            Box::new(subjects::SomeProviderImpl { id: 103 }), +        ); + +        assert!(binding_map.has::<Interface>(None)); +    } + +    #[test] +    fn can_get_has_with_name() +    { +        type Interface = (); + +        let mut binding_map = DIContainerBindingMap::<dyn subjects::SomeProvider>::new(); + +        assert!(!binding_map.has::<Interface>(Some("awesome"))); + +        binding_map.bindings.insert( +            DIContainerBindingKey { +                type_id: TypeId::of::<Interface>(), +                name: Some("awesome"), +            }, +            Box::new(subjects::SomeProviderImpl { id: 101 }), +        ); + +        assert!(binding_map.has::<Interface>(Some("awesome"))); +    } +} @@ -1,5 +1,7 @@  #![cfg_attr(feature = "factory", feature(unboxed_closures, fn_traits))]  #![cfg_attr(doc_cfg, feature(doc_cfg))] +#![cfg_attr(test, feature(register_tool))] +#![cfg_attr(test, register_tool(tarpaulin))]  #![deny(clippy::all)]  #![deny(clippy::pedantic)]  #![allow(clippy::module_name_repetitions)] @@ -41,6 +43,7 @@ pub mod libs;  mod provider;  #[cfg(test)] +#[tarpaulin::skip]  mod test_utils;  /// Shortcut for creating a DI container binding for a injectable without a declared | 
