Example #1
0
        public void CreateInstanceInitializationMembers()
        {
            _mutableType.AddInitialization(ctx => Expression.Constant("blub"));
            _mutableType.AddInitialization(ctx => ctx.InitializationSemantics);

            var result = _builder.CreateInitializationMembers(_mutableType);

            var counter    = (MutableFieldInfo)result.Item1;
            var initMethod = (MutableMethodInfo)result.Item2;

            // Interface added.
            Assert.That(_mutableType.AddedInterfaces, Is.EqualTo(new[] { typeof(IInitializableObject) }));

            // Field added.
            Assert.That(_mutableType.AddedFields, Is.EqualTo(new[] { counter }));
            Assert.That(counter.Name, Is.EqualTo("<tp>_ctorRunCounter"));
            Assert.That(counter.FieldType, Is.SameAs(typeof(int)));
            Assert.That(counter.AddedCustomAttributes.Single().Type, Is.SameAs(typeof(NonSerializedAttribute)));

            // Initialization method added.
            var methodAttributes = MethodAttributes.Private | MethodAttributes.Virtual | MethodAttributes.NewSlot | MethodAttributes.HideBySig;

            Assert.That(_mutableType.AddedMethods, Is.EqualTo(new[] { initMethod }));
            Assert.That(initMethod.DeclaringType, Is.SameAs(_mutableType));
            Assert.That(initMethod.Name, Is.EqualTo("Remotion.TypePipe.Implementation.IInitializableObject.Initialize"));
            Assert.That(initMethod.Attributes, Is.EqualTo(methodAttributes));
            Assert.That(initMethod.ReturnType, Is.SameAs(typeof(void)));
            var parameters = initMethod.GetParameters();

            Assert.That(parameters, Has.Length.EqualTo(1));
            Assert.That(parameters[0].ParameterType, Is.SameAs(typeof(InitializationSemantics)));

            var interfaceMethod = NormalizingMemberInfoFromExpressionUtility.GetMethod((IInitializableObject obj) => obj.Initialize(0));

            Assert.That(initMethod.AddedExplicitBaseDefinitions, Is.EqualTo(new[] { interfaceMethod }));

            var expectedBody = Expression.Block(typeof(void), Expression.Constant("blub"), initMethod.ParameterExpressions[0]);

            ExpressionTreeComparer.CheckAreEqualTrees(expectedBody, initMethod.Body);
        }
Example #2
0
        public void DefineTypeFacets()
        {
            var typeInitializer = _mutableType.AddTypeInitializer(ctx => Expression.Empty());

            var instanceInitialization = ExpressionTreeObjectMother.GetSomeExpression();

            _mutableType.AddInitialization(ctx => instanceInitialization);

            var customAttribute = CustomAttributeDeclarationObjectMother.Create();

            _mutableType.AddCustomAttribute(customAttribute);

            var @interface = typeof(IDisposable);

            _mutableType.AddInterface(@interface);

            var field       = _mutableType.AddField();
            var constructor = _mutableType.AddConstructor();
            var method      = _mutableType.AddMethod();
            var property    = _mutableType.AddProperty();
            var event_      = _mutableType.AddEvent();

            using (_mockRepository.Ordered())
            {
                var context = PopulateContext(_generator, 2);

                _typeBuilderMock.Expect(mock => mock.SetParent(_mutableType.BaseType));

                _memberEmitterMock.Expect(mock => mock.AddConstructor(context, typeInitializer));

                _initializationBuilderMock.Expect(mock => mock.CreateInitializationMembers(_mutableType)).Return(_fakeInitializationMembers);
                _proxySerializationEnablerMock.Expect(mock => mock.MakeSerializable(_mutableType, _fakeInitializationMethod));

                _typeBuilderMock.Expect(mock => mock.SetCustomAttribute(customAttribute));
                _typeBuilderMock.Expect(mock => mock.AddInterfaceImplementation(@interface));
                _memberEmitterMock.Expect(mock => mock.AddField(context, field));
                _initializationBuilderMock.Expect(
                    mock => mock.WireConstructorWithInitialization(constructor, _fakeInitializationMembers, _proxySerializationEnablerMock));
                _memberEmitterMock.Expect(mock => mock.AddConstructor(context, constructor));
                _memberEmitterMock.Expect(mock => mock.AddMethod(context, method));
                SetupExpectationsForAccessors(_memberEmitterMock, _mutableType.AddedMethods.Except(new[] { method }));
                _memberEmitterMock.Expect(mock => mock.AddProperty(context, property));
                _memberEmitterMock.Expect(mock => mock.AddEvent(context, event_));
            }
            _mockRepository.ReplayAll();

            _generator.DefineTypeFacets();

            _mockRepository.VerifyAll();
        }
Example #3
0
        public void AddInitializations(List <Type> mixinTypes)
        {
            ArgumentUtility.CheckNotNull("mixinTypes", mixinTypes);
            Assertion.IsNotNull(_extensionsField, "AddExtensionsField must be called first.");
            Assertion.IsNotNull(_extensionsInitializedField, "AddFields must be called first.");
            Assertion.IsNotNull(_firstField, "AddFields must be called first.");
            Assertion.IsNotNull(_nextCallProxy, "AddNextCallProxy must be called first.");
            Assertion.IsNotNull(_mixinArrayInitializerField, "AddFields must be called first.");
            Assertion.IsNotNull(_extensionsInitializedField, "AddFields must be called first.");

            _initializationMethod = _concreteTarget.AddMethod(
                "__InitializeMixins",
                MethodAttributes.Private,
                parameters: new[] { new ParameterDeclaration(typeof(bool), "isDeserialization") },
                bodyProvider: ctx => ImplementMixinInitalizationMethod(ctx, mixinTypes));

            _concreteTarget.AddInitialization(
                ctx => Expression.Call(
                    ctx.This,
                    _initializationMethod,
                    Expression.Equal(ctx.InitializationSemantics, Expression.Constant(InitializationSemantics.Deserialization))));
        }