public void InterfaceReRegisteredFromInstanceToInstance_Success()
        {
            var c = new Container();
            IEmptyClass emptyClass = new EmptyClass();
            c.RegisterInstance(emptyClass).AsPerHttpContext();

            var controller = new DefaultController();
            HttpContext.Current = new HttpContext(new HttpRequest("", "http://tempuri.org", ""), new HttpResponse(new StringWriter()));
            var result1 = controller.ResolveObject<IEmptyClass>(c, ResolveKind.PartialEmitFunction);
            var emptyClass1 = (IEmptyClass)((ViewResult)result1).Model;
            var result2 = controller.ResolveObject<IEmptyClass>(c, ResolveKind.PartialEmitFunction);
            var emptyClass2 = (IEmptyClass)((ViewResult)result2).Model;

            IEmptyClass emptyClass3 = new EmptyClass();
            c.RegisterInstance(emptyClass3).AsPerHttpContext();
            var result4 = controller.ResolveObject<IEmptyClass>(c, ResolveKind.PartialEmitFunction);
            var emptyClass4 = (IEmptyClass)((ViewResult)result4).Model;
            var result5 = controller.ResolveObject<IEmptyClass>(c, ResolveKind.PartialEmitFunction);
            var emptyClass5 = (IEmptyClass)((ViewResult)result5).Model;

            Assert.AreEqual(emptyClass, emptyClass1);
            Assert.AreEqual(emptyClass1, emptyClass2);
            Assert.AreEqual(emptyClass3, emptyClass4);
            Assert.AreEqual(emptyClass4, emptyClass5);
            Assert.AreNotEqual(emptyClass, emptyClass3);
        }
        public void NestedFactoryObjectReturnNewObject_Success()
        {
            var c = new Container();
            c.RegisterType<IEmptyClass>(() => new EmptyClass()).AsPerHttpContext();
            c.RegisterType<ISampleClassWithInterfaceAsParameter, SampleClassWithInterfaceAsParameter>().AsPerHttpContext();

            var controller = new DefaultController();
            HttpContext.Current = new HttpContext(new HttpRequest("", "http://tempuri.org", ""), new HttpResponse(new StringWriter()));
            var result1 = controller.ResolveObject<ISampleClassWithInterfaceAsParameter>(c, ResolveKind.PartialEmitFunction);
            var sampleClass1 = (ISampleClassWithInterfaceAsParameter)((ViewResult)result1).Model;
            var result2 = controller.ResolveObject<ISampleClassWithInterfaceAsParameter>(c, ResolveKind.PartialEmitFunction);
            var sampleClass2 = (ISampleClassWithInterfaceAsParameter)((ViewResult)result2).Model;

            Assert.AreEqual(sampleClass1, sampleClass2);
            Assert.AreEqual(sampleClass1.EmptyClass, sampleClass2.EmptyClass);
        }
        public void DifferentHttpContext_RegisterClass_Success()
        {
            var c = new Container();
            c.RegisterType<EmptyClass>().AsPerHttpContext();
            c.RegisterType<SampleClass>().AsPerHttpContext();

            var controller = new DefaultController();
            HttpContext.Current = new HttpContext(new HttpRequest("", "http://tempuri.org", ""), new HttpResponse(new StringWriter()));
            var result1 = controller.ResolveObject<SampleClass>(c, ResolveKind.PartialEmitFunction);
            var sampleClass1 = (SampleClass)((ViewResult)result1).Model;
            HttpContext.Current = new HttpContext(new HttpRequest("", "http://tempuri.org", ""), new HttpResponse(new StringWriter()));
            var result2 = controller.ResolveObject<SampleClass>(c, ResolveKind.PartialEmitFunction);
            var sampleClass2 = (SampleClass)((ViewResult)result2).Model;

            Assert.IsNotNull(sampleClass1);
            Assert.IsNotNull(sampleClass1.EmptyClass);
            Assert.IsNotNull(sampleClass2);
            Assert.IsNotNull(sampleClass2.EmptyClass);
            Assert.AreNotEqual(sampleClass1, sampleClass2);
            Assert.AreNotEqual(sampleClass1.EmptyClass, sampleClass2.EmptyClass);
        }
        public void RegisteredInterfaceAsClassWithTwoConstructorsWithAttributeDependencyConstrutor_Fail()
        {
            var c = new Container();
            c.RegisterType<EmptyClass>().AsPerHttpContext();
            c.RegisterType<ISampleClass, SampleClassWithTwoDependencyConstrutor>().AsPerHttpContext();

            var controller = new DefaultController();
            HttpContext.Current = new HttpContext(new HttpRequest("", "http://tempuri.org", ""), new HttpResponse(new StringWriter()));
            var result = controller.ResolveObject<ISampleClass>(c, ResolveKind.PartialEmitFunction);
            var sampleClass = (ISampleClass)((ViewResult)result).Model;

            Assert.IsNull(sampleClass);
        }
        public void DifferentThreads_RegisterManyGenericClasses_Success()
        {
            var c = new Container();
            c.RegisterType<IEmptyClass, EmptyClass>().AsPerHttpContext();
            c.RegisterType<ISampleClassWithInterfaceAsParameter, SampleClassWithInterfaceAsParameter>().AsPerHttpContext();
            c.RegisterType<IGenericClass<IEmptyClass>, GenericClass<IEmptyClass>>().AsPerHttpContext();
            c.RegisterType<IGenericClass<ISampleClassWithInterfaceAsParameter>, GenericClass<ISampleClassWithInterfaceAsParameter>>().AsPerHttpContext();

            var controller = new DefaultController();
            HttpContext.Current = new HttpContext(new HttpRequest("", "http://tempuri.org", ""), new HttpResponse(new StringWriter()));
            var result1 = controller.ResolveObject<IGenericClass<IEmptyClass>>(c, ResolveKind.PartialEmitFunction);
            var genericClass1 = (IGenericClass<IEmptyClass>)((ViewResult)result1).Model;

            HttpContext.Current = new HttpContext(new HttpRequest("", "http://tempuri.org", ""), new HttpResponse(new StringWriter()));
            var result2 = controller.ResolveObject<IGenericClass<ISampleClassWithInterfaceAsParameter>>(c, ResolveKind.PartialEmitFunction);
            var genericClass2 = (IGenericClass<ISampleClassWithInterfaceAsParameter>)((ViewResult)result2).Model;

            Assert.AreNotEqual(genericClass1, genericClass2);
            Assert.AreNotEqual(genericClass1.GetType(), genericClass2.GetType());
            Assert.AreNotEqual(genericClass1.NestedClass, genericClass2.NestedClass.EmptyClass);
            Assert.AreEqual(genericClass1.NestedClass.GetType(), genericClass2.NestedClass.EmptyClass.GetType());
        }
        public void ClassReRegisteredFromClassToTheSameClass_Success()
        {
            var c = new Container();
            c.RegisterType<EmptyClass>().AsPerHttpContext();

            var controller = new DefaultController();
            HttpContext.Current = new HttpContext(new HttpRequest("", "http://tempuri.org", ""), new HttpResponse(new StringWriter()));
            var result1 = controller.ResolveObject<EmptyClass>(c, ResolveKind.PartialEmitFunction);
            var emptyClass1 = (EmptyClass)((ViewResult)result1).Model;
            var result2 = controller.ResolveObject<EmptyClass>(c, ResolveKind.PartialEmitFunction);
            var emptyClass2 = (EmptyClass)((ViewResult)result2).Model;

            c.RegisterType<EmptyClass>().AsPerHttpContext();
            var result3 = controller.ResolveObject<EmptyClass>(c, ResolveKind.PartialEmitFunction);
            var emptyClass3 = (EmptyClass)((ViewResult)result3).Model;
            var result4 = controller.ResolveObject<EmptyClass>(c, ResolveKind.PartialEmitFunction);
            var emptyClass4 = (EmptyClass)((ViewResult)result4).Model;

            Assert.AreEqual(emptyClass1, emptyClass2);
            Assert.AreEqual(emptyClass3, emptyClass4);
            Assert.AreNotEqual(emptyClass1, emptyClass3);
        }
        public void RegisterClassWithNestedInterfaceAsParameterWithInterfaceAsParameterAndWithConstructorWithAttributeDependencyConstrutor_Success()
        {
            var c = new Container();
            c.RegisterType<IEmptyClass, EmptyClass>().AsPerHttpContext();
            c.RegisterType<ISampleClassWithInterfaceAsParameter, SampleClassWithInterfaceAsParameterWithDependencyConstrutor>().AsPerHttpContext();
            c.RegisterType<SampleClassWithNestedInterfaceAsParameterWithDependencyConstrutor>().AsPerHttpContext();

            var controller = new DefaultController();
            HttpContext.Current = new HttpContext(new HttpRequest("", "http://tempuri.org", ""), new HttpResponse(new StringWriter()));
            var result = controller.ResolveObject<SampleClassWithNestedInterfaceAsParameterWithDependencyConstrutor>(c, ResolveKind.PartialEmitFunction);
            var sampleClass = (SampleClassWithNestedInterfaceAsParameterWithDependencyConstrutor)((ViewResult)result).Model;

            Assert.IsNotNull(sampleClass);
            Assert.IsNotNull(sampleClass.SampleClassWithInterfaceAsParameter);
            Assert.IsNotNull(sampleClass.SampleClassWithInterfaceAsParameter.EmptyClass);
        }
        public void RegisterGenericClassWithClassWithNestedClass_Success()
        {
            var c = new Container();
            c.RegisterType<IEmptyClass, EmptyClass>().AsPerHttpContext();
            c.RegisterType<ISampleClassWithInterfaceAsParameter, SampleClassWithInterfaceAsParameter>().AsPerHttpContext();
            c.RegisterType<IGenericClass<ISampleClassWithInterfaceAsParameter>, GenericClass<ISampleClassWithInterfaceAsParameter>>().AsPerHttpContext();

            var controller = new DefaultController();
            HttpContext.Current = new HttpContext(new HttpRequest("", "http://tempuri.org", ""), new HttpResponse(new StringWriter()));
            var result = controller.ResolveObject<IGenericClass<ISampleClassWithInterfaceAsParameter>>(c, ResolveKind.PartialEmitFunction);
            var genericClass = (IGenericClass<ISampleClassWithInterfaceAsParameter>)((ViewResult)result).Model;

            Assert.IsNotNull(genericClass);
            Assert.IsNotNull(genericClass.NestedClass);
            Assert.IsNotNull(genericClass.NestedClass.EmptyClass);
        }
        public void RegisterGenericClassWithManyParameters_Success()
        {
            var c = new Container();
            c.RegisterType<EmptyClass>().AsPerHttpContext();
            c.RegisterType<SampleClass>().AsPerHttpContext();
            c.RegisterType<GenericClassWithManyParameters<EmptyClass, SampleClass>>().AsPerHttpContext();

            var controller = new DefaultController();
            HttpContext.Current = new HttpContext(new HttpRequest("", "http://tempuri.org", ""), new HttpResponse(new StringWriter()));
            var result = controller.ResolveObject<GenericClassWithManyParameters<EmptyClass, SampleClass>>(c, ResolveKind.FullEmitFunction);
            var genericClass = (GenericClassWithManyParameters<EmptyClass, SampleClass>)((ViewResult)result).Model;

            Assert.IsNotNull(genericClass);
            Assert.IsNotNull(genericClass.NestedClass1);
            Assert.IsNotNull(genericClass.NestedClass2);
            Assert.IsNotNull(genericClass.NestedClass2.EmptyClass);
            Assert.AreEqual(genericClass.NestedClass1, genericClass.NestedClass2.EmptyClass);
        }
        public void InternalIntTypeNotRegistered_Fail()
        {
            var c = new Container();
            c.RegisterType<SampleClassWithIntType>().AsPerHttpContext();

            var controller = new DefaultController();
            HttpContext.Current = new HttpContext(new HttpRequest("", "http://tempuri.org", ""), new HttpResponse(new StringWriter()));
            var result = controller.ResolveObject<SampleClassWithIntType>(c, ResolveKind.PartialEmitFunction);
            var sampleClassWithSimpleType = (SampleClassWithIntType)((ViewResult)result).Model;

            Assert.IsNull(sampleClassWithSimpleType);
        }
        public void RegisterClassWithCycleInConstructor_Fail()
        {
            var c = new Container();
            c.RegisterType<SecondClassWithCycleInConstructor>().AsPerHttpContext();
            c.RegisterType<FirstClassWithCycleInConstructor>().AsPerHttpContext();

            var controller = new DefaultController();
            HttpContext.Current = new HttpContext(new HttpRequest("", "http://tempuri.org", ""), new HttpResponse(new StringWriter()));
            var result = controller.ResolveObject<FirstClassWithCycleInConstructor>(c, ResolveKind.PartialEmitFunction);
            var sampleClass = (FirstClassWithCycleInConstructor)((ViewResult)result).Model;

            Assert.IsNull(sampleClass);
        }
        public void RegisterClassWithConstructorWithoutParameters_Success()
        {
            var c = new Container();
            c.RegisterType<EmptyClass>().AsPerHttpContext();

            var controller = new DefaultController();
            HttpContext.Current = new HttpContext(new HttpRequest("", "http://tempuri.org", ""), new HttpResponse(new StringWriter()));
            var result = controller.ResolveObject<EmptyClass>(c, ResolveKind.FullEmitFunction);
            var emptyClass = (EmptyClass)((ViewResult)result).Model;

            Assert.IsNotNull(emptyClass);
        }
        public void SameThread_RegisterManyGenericClasses_Success()
        {
            var c = new Container();
            c.RegisterType<EmptyClass>().AsPerHttpContext();
            c.RegisterType<SampleClass>().AsPerHttpContext();
            c.RegisterType<GenericClass<EmptyClass>>().AsPerHttpContext();
            c.RegisterType<GenericClass<SampleClass>>().AsPerHttpContext();

            var controller = new DefaultController();
            HttpContext.Current = new HttpContext(new HttpRequest("", "http://tempuri.org", ""), new HttpResponse(new StringWriter()));
            var result1 = controller.ResolveObject<GenericClass<EmptyClass>>(c, ResolveKind.FullEmitFunction);
            var genericClass1 = (GenericClass<EmptyClass>)((ViewResult)result1).Model;
            var result2 = controller.ResolveObject<GenericClass<SampleClass>>(c, ResolveKind.FullEmitFunction);
            var genericClass2 = (GenericClass<SampleClass>)((ViewResult)result2).Model;

            Assert.AreNotEqual(genericClass1, genericClass2);
            Assert.AreNotEqual(genericClass1.GetType(), genericClass2.GetType());
            Assert.AreEqual(genericClass1.NestedClass, genericClass2.NestedClass.EmptyClass);
            Assert.AreEqual(genericClass1.NestedClass.GetType(), genericClass2.NestedClass.EmptyClass.GetType());
        }
        public void InterfaceReRegisteredFromOneClassToTheOther_Success()
        {
            var c = new Container();
            c.RegisterType<EmptyClass>().AsPerHttpContext();
            c.RegisterType<ISampleClass, SampleClass>().AsPerHttpContext();

            var controller = new DefaultController();
            HttpContext.Current = new HttpContext(new HttpRequest("", "http://tempuri.org", ""), new HttpResponse(new StringWriter()));
            var result1 = controller.ResolveObject<ISampleClass>(c, ResolveKind.PartialEmitFunction);
            var sampleClass1 = (ISampleClass)((ViewResult)result1).Model;
            var result2 = controller.ResolveObject<ISampleClass>(c, ResolveKind.PartialEmitFunction);
            var sampleClass2 = (ISampleClass)((ViewResult)result2).Model;

            c.RegisterType<ISampleClass, SampleClassOther>().AsPerHttpContext();
            var result3 = controller.ResolveObject<ISampleClass>(c, ResolveKind.PartialEmitFunction);
            var sampleClass3 = (ISampleClass)((ViewResult)result3).Model;
            var result4 = controller.ResolveObject<ISampleClass>(c, ResolveKind.PartialEmitFunction);
            var sampleClass4 = (ISampleClass)((ViewResult)result4).Model;

            Assert.AreEqual(sampleClass1, sampleClass2);
            Assert.AreEqual(sampleClass1.GetType(), sampleClass2.GetType());
            Assert.AreEqual(sampleClass1.EmptyClass, sampleClass2.EmptyClass);
            Assert.AreEqual(sampleClass3, sampleClass4);
            Assert.AreEqual(sampleClass3.GetType(), sampleClass4.GetType());
            Assert.AreEqual(sampleClass3.EmptyClass, sampleClass4.EmptyClass);
            Assert.AreNotEqual(sampleClass1, sampleClass3);
            Assert.AreNotEqual(sampleClass1.GetType(), sampleClass3.GetType());
            Assert.AreEqual(sampleClass1.EmptyClass, sampleClass3.EmptyClass);
        }