/// <summary>
        /// do the inject job
        /// </summary>
        /// <param name="inject">specific injection operation</param>
        /// <typeparam name="T">generic or non-generic <see cref="Injector"/></typeparam>
        /// <returns></returns>
        private static IServiceProvider configureServices <T>(Action <T> inject) where T : Injector
        {
            var typeFactory = new TypeFactory();
            var creator     = new InstanceCreator <T>();

            foreach (var type in creator.GetInjectorImpTypes(typeFactory))
            {
                if (creator.GetInstance(type, out var injector))
                {
                    inject(injector);
                }
            }

            return(Injector.Build());
        }
        public void GetInjectorImpTypes_Injector_1_ReturnsOneAndRightTypeInstance()
        {
            var stubTypeProvider = Substitute.For <ITypeProvider>();

            stubTypeProvider.GetTypes().Returns(new List <Type>()
            {
                typeof(Injector_1)
            });
            var typeFactory = new TypeFactory
            {
                _types = new Lazy <IEnumerable <Type> >((() => stubTypeProvider.GetTypes()))
            };

            var creator = new InstanceCreator <Injector>();
            var result  = creator.GetInjectorImpTypes(typeFactory);

            Assert.NotZero(result.Count());
            Assert.IsTrue(result.Count() == 1);
            Assert.IsTrue(result.First().FullName == typeof(Injector_1).FullName);
        }
        public void GetInjectorImpTypes_NoImplication_ThrowsException()
        {
            var stubTypeProvider = Substitute.For <ITypeProvider>();

            stubTypeProvider.GetTypes().Returns(new List <Type>()
            {
                typeof(InstanceCreatorTest)
            });
            var typeFactory = new TypeFactory
            {
                _types = new Lazy <IEnumerable <Type> >((() => stubTypeProvider.GetTypes()))
            };

            var creator = new InstanceCreator <Injector>();

            Assert.Catch <NonImplicationException>(() =>
            {
                creator.GetInjectorImpTypes(typeFactory);
            }, $"Can't find one implication of {typeof(Injector).Name}.");
        }