public void FrameworkContainerForCastle_Register_Test1()
        {
            FrameworkContainerForCastle container = new FrameworkContainerForCastle();

            container.RegisterType <IMockSimple, MockSimple>();

            container.Resolve <IMockSimple>().Say();
        }
        public void FrameworkContainerForCastle_Register_Dependency_Injection_Test1()
        {
            FrameworkContainerForCastle container = new FrameworkContainerForCastle();

            container.RegisterType <IMockSimple, MockSimple>();
            container.RegisterType <IMockConstructorInject, MockConstructorInject>();

            container.Resolve <IMockConstructorInject>().Depend();
        }
        public void FrameworkContainerForCastle_Property_Injection_Test()
        {
            FrameworkContainerForCastle container = new FrameworkContainerForCastle();

            container.RegisterType <IMockSimple, MockSimple>()
            .RegisterType <IMockPropertyInjection, MockPropertyInjection>();

            container.Resolve <IMockPropertyInjection>().Say();
        }
        public void FrameworkCompositionResolverForCastle_Basic_Contract_Test()
        {
            var types = new Type[]
            {
                typeof(MockClass_Basic_Contract)
            };

            FrameworkContainerForCastle container = CompositionTheTypes(types);

            container.Resolve <IMockClass_Basic_Contract>().Say();
        }
        public void FrameworkCompositionResolverForCastle_PropertyInjection_By_Key_Type()
        {
            var types = new Type[]
            {
                typeof(MockClass_PropertyInjection_By_key_Type_a),
                typeof(MockClass_PropertyInjection_By_Key_Type_b)
            };

            FrameworkContainerForCastle container = CompositionTheTypes(types);

            container.Resolve <MockClass_PropertyInjection_By_Key_Type_b>("b").Say();
        }
        public void FrameworkCompositionResolverForCastle_PropertyInjection_By_Contract_Dependency()
        {
            var types = new Type[]
            {
                typeof(MockClass_PropertyInjection_By_Contract),
                typeof(MockClass_PropertyInjection_By_Contract_Dependency)
            };

            FrameworkContainerForCastle container = CompositionTheTypes(types);

            container.Resolve <MockClass_PropertyInjection_By_Contract_Dependency>().Depend();
        }
        public void FrameworkContainerForCastle_With_Child_Container_Must_One_Child_Test1()
        {
            FrameworkContainerForCastle container = new FrameworkContainerForCastle();

            container.RegisterType <IMockSimple, MockSimple>();

            FrameworkContainerForCastleChild child = new FrameworkContainerForCastleChild("child", container);

            child.RegisterType <IMockConstructorInject, MockConstructorInject>();

            Assert.IsTrue(container.Childs.Count() == 1, "container 에 하나의 자식 Container 를 등록하였지만, Childs 개수가 {0} 이라 오류입니다.", container.Childs.Count());
        }
        public void FrameworkCompositionResolverForCastle_ConstructorInjection_By_Contract_and_Dependency_Injection()
        {
            var types = new Type[]
            {
                typeof(MockClass_ConstructorInjection_ContractClass),
                typeof(MockClass_ConstructorInjection_DependencyClass)
            };

            FrameworkContainerForCastle container = CompositionTheTypes(types);
            var obj = container.Resolve <MockClass_ConstructorInjection_DependencyClass>();

            Assert.IsTrue(obj.Name == "Junil, Um", "ConstructorInjection 이 올바르게 되지 않아 값이 틀려서 오류가 발생");
        }
        public void FrameworkCompositionResolverForCastle_ConstructorInjection_By_Key()
        {
            var types = new Type[]
            {
                typeof(MockClass_ConstructorInjection_By_Key_a),
                typeof(MockClass_ConstructorInjection_By_key_b)
            };

            FrameworkContainerForCastle container = CompositionTheTypes(types);
            var obj = container.Resolve <MockClass_ConstructorInjection_By_key_b>("b");

            Assert.IsTrue(obj.UniqueKey == "a", "ConstructorInjection된 키가 a인데 key 값이 a가 아니어서 오류가 발생");
        }
        public void FrameworkCompositionResolverForCastle_MethodInjection_By_Key()
        {
            var types = new Type[]
            {
                typeof(MockClass_MethodInjection_By_Key_a),
                typeof(MockClass_MethodInjection_By_Key_b)
            };

            FrameworkContainerForCastle container = CompositionTheTypes(types);
            var obj = container.Resolve <MockClass_MethodInjection_By_Key_b>("b");

            Assert.IsTrue(obj.Key == "a", "MethodInjection된 키값이 a여야 하는데 키 값이 달라서 오류가 발생");
        }
        public void FrameworkCompositionResolverForCastle_PropertyInjection_By_DependencyInjection_DefaultValue()
        {
            FrameworkContainerForCastle container = CompositionTheTypes(typeof(MockClass_PropertyInjection_DependencyContract_DefaultValueProperty).ToEnumerable().ToArray());

            var name = container.Resolve <MockClass_PropertyInjection_DependencyContract_DefaultValueProperty>().Name;
            var age  = container.Resolve <MockClass_PropertyInjection_DependencyContract_DefaultValueProperty>().Age;

            TestContext.WriteLine("Name={0}", name);
            TestContext.WriteLine("Age={0}", age);

            Assert.IsTrue(name == "Junil, Um", "Name 프로퍼티의 값이 선언된 DependencyInjectionAttribute.DefaultValue 의 값과 달라서 오류가 발생");
            Assert.IsTrue(age == 100, "Age 프로퍼티의 값이 선언된 DependencyInjectionAttribute.DefaultValue 의 값과 달라서 오류가 발생");
        }
        public void FrameworkCompositionResolverForCastle_MethodInjection_By_Injection()
        {
            var types = new Type[]
            {
                typeof(MockClass_MethodInjection_By_Contract),
                typeof(MockClass_MethodInjection_By_Dependency)
            };

            FrameworkContainerForCastle container = CompositionTheTypes(types);
            var obj = container.Resolve <MockClass_MethodInjection_By_Dependency>();

            Assert.IsTrue(obj.Key == "Contract", "Execute메서드에 Injection된 값이 틀려서 오류가 발생");
        }
        public void FrameworkCompositionResolverForCastle_MethodInjection_By_DependencyInjection()
        {
            var types = new Type[]
            {
                typeof(MockClass_MethodInjection_By_DependencyInjection)
            };

            FrameworkContainerForCastle container = CompositionTheTypes(types);
            var obj = container.Resolve <MockClass_MethodInjection_By_DependencyInjection>();

            Assert.IsTrue(obj.Name == "Junil, Um", "MethodInjection의 DefaultValue로 초기화된 값이 달라서 오류가 발생");
            Assert.IsTrue(obj.Age == 100, "MethodInjection의 DefaultValue로 초기화된 값이 달라서 오류가 발생");
        }
        private FrameworkContainerForCastle CompositionTheTypes(Type[] types)
        {
            FrameworkDependencyVisitor visitor = new FrameworkDependencyVisitor(types);
            var root = visitor.VisitTypes();

            WriteToSerialization(root);

            FrameworkContainerForCastle           container = new FrameworkContainerForCastle();
            FrameworkCompositionResolverForCastle resolver  = new FrameworkCompositionResolverForCastle(container, root);

            resolver.Compose();
            return(container);
        }
        public void FrameworkContainerForCastle_Register_Singleton_Test()
        {
            FrameworkContainerForCastle container = new FrameworkContainerForCastle();

            container.RegisterType <IMockSimple, MockSimple>(LifetimeFlag.Singleton);

            var obj = container.Resolve <IMockSimple>();

            obj.Name = "엄준일";

            obj = container.Resolve <IMockSimple>();

            Assert.IsTrue(obj.Name == "엄준일", "FrameworkContainer 에 Singleton 객체를 등록하였지만, 객체의 상태가 변했습니다");
        }
        public void FrameworkContainerForCastle_Register_PerCall_Test()
        {
            FrameworkContainerForCastle container = new FrameworkContainerForCastle();

            container.RegisterType <IMockSimple, MockSimple>(LifetimeFlag.PerCall);

            var obj = container.Resolve <IMockSimple>();

            obj.Name = "엄준일";

            obj = container.Resolve <IMockSimple>();

            Assert.IsTrue(obj.Name == null, "FrameworkContainer 에 PerCall 객체를 등록하였지만, 객체의 상태가 초기값과 다릅니다.");
        }
        public void FrameworkCompositionResolverForCastle_ConstructorInjection_By_DependencyInjection_DefaultValue()
        {
            var types = new Type[]
            {
                typeof(MockClass_ConstructorInjection_By_DependencyInjection_DefaultValue)
            };

            FrameworkContainerForCastle container = CompositionTheTypes(types);

            var obj = container.Resolve <MockClass_ConstructorInjection_By_DependencyInjection_DefaultValue>();

            Assert.IsTrue(obj.Name == "Junil, Um", "MockClass_ConstructorInjection_By_DefaultValue.Name 값이 DefaultValue 값과 달라서 오류");
            Assert.IsTrue(obj.Age == 100, "MockClass_ConstructorInjection_By_DefaultValue.Age 가 DefaultValue 값과 달라서 오류");
        }
        public void FrameworkCompositionResolverForCastle_PropertyInjection_By_Key()
        {
            var types = new Type[]
            {
                typeof(MockClass_PropertyInjection_By_Key_a),
                typeof(MockClass_PropertyInjection_By_Key_b)
            };

            FrameworkContainerForCastle container = CompositionTheTypes(types);

            var keya = container.Resolve <IMockClass_PropertyInjection_By_Key>("a").Key;
            var keyb = container.Resolve <IMockClass_PropertyInjection_By_Key>("b").Key;

            TestContext.WriteLine("Key A = " + keya);
            TestContext.WriteLine("Key B = " + keyb);

            Assert.IsTrue(keya == "a", "MockClass_PropertyInjection_By_Key_a 클래스와 계약된 키 값은 a인데, 값이 a가 아니어서 오류");
            Assert.IsTrue(keyb == "b", "MockClass_PropertyInjection_By_Key_b 클래스와 계약된 키 값은 b인데, 값이 b가 아니어서 오류");
        }