Example #1
0
        /// <summary>
        /// Creates a new <see cref="Delegate"/> instance.
        /// </summary>
        /// <param name="request">The request that describes what to create.</param>
        /// <param name="context">A context that can be used to create other specimens.</param>
        /// <exception cref="ArgumentNullException"><paramref name="context"/> is null.</exception>
        /// <returns>
        /// A new <see cref="Delegate"/> instance, if <paramref name="request"/> is a request for a
        /// <see cref="Delegate"/>; otherwise, a <see cref="NoSpecimen"/> instance.
        /// </returns>
        public object Create(object request, ISpecimenContext context)
        {
            if (context == null)
            {
                throw new ArgumentNullException(nameof(context));
            }

            var delegateType = request as Type;

            if (delegateType == null)
            {
#pragma warning disable 618
                return(new NoSpecimen(request));

#pragma warning restore 618
            }

            if (!typeof(Delegate).IsAssignableFrom(delegateType))
            {
#pragma warning disable 618
                return(new NoSpecimen(request));

#pragma warning restore 618
            }

            var delegateMethod       = delegateType.GetMethod("Invoke");
            var methodSpecimenParams = DelegateGenerator.CreateMethodSpecimenParameters(delegateMethod);
            var methodSpecimenBody   = DelegateGenerator.CreateMethodSpecimenBody(delegateMethod, context);

            var delegateSpecimen = Expression.Lambda(delegateType, methodSpecimenBody, methodSpecimenParams).Compile();

            return(delegateSpecimen);
        }
 public void SutIsSpecimenBuilder()
 {
     // Fixture setup
     // Exercise system
     var sut = new DelegateGenerator();
     // Verify outcome
     Assert.IsAssignableFrom<ISpecimenBuilder>(sut);
     // Teardown
 }
 public void CreateWithNullContainerThrowsArgumentNullException()
 {
     // Fixture setup
     var dummyRequest = new object();
     var sut = new DelegateGenerator();
     // Exercise system and verify outcome
     Assert.Throws(typeof(ArgumentNullException), () => sut.Create(dummyRequest, null));
     // Teardown
 }
 public void CreateWithNullRequestReturnsNoSpecimen()
 {
     // Fixture setup
     var sut = new DelegateGenerator();
     // Exercise system
     var dummyContainer = new DelegatingSpecimenContext();
     var result = sut.Create(null, dummyContainer);
     // Verify outcome
     Assert.Equal(new NoSpecimen(), result);
     // Teardown
 }
 public void CreateWithVoidSingleObjectParameterDelegateRequestReturnsCorrectResult()
 {
     // Fixture setup
     var delegateRequest = typeof(Action<object>);
     var sut = new DelegateGenerator();
     // Exercise system
     var dummyContainer = new DelegatingSpecimenContext();
     var result = sut.Create(delegateRequest, dummyContainer);
     // Verify outcome
     Assert.IsType<Action<object>>(result);
     // Teardown
 }
 public void CreateWithNonDelegateRequestReturnsNoSpecimen()
 {
     // Fixture setup
     var nonDelegateRequest = new object();
     var sut = new DelegateGenerator();
     // Exercise system
     var dummyContainer = new DelegatingSpecimenContext();
     var result = sut.Create(nonDelegateRequest, dummyContainer);
     // Verify outcome
     var expectedResult = new NoSpecimen(nonDelegateRequest);
     Assert.Equal(expectedResult, result);
     // Teardown
 }
 public void CreateWithReturnValueParameterlessDelegateRequestReturnsDelegateReturningValueSpecimen()
 {
     // Fixture setup
     var delegateRequest = typeof(Func<int>);
     var expectedResult = 3;
     var sut = new DelegateGenerator();
     // Exercise system
     var dummyContainer = new DelegatingSpecimenContext
     {
         OnResolve = arg => expectedResult
     };
     var result = sut.Create(delegateRequest, dummyContainer);
     // Verify outcome
     var actualResult = ((Func<int>)result).Invoke();
     Assert.Equal(expectedResult, actualResult);
     // Teardown
 }
 public void CreateWithReturnValueParameterlessDelegateRequestReturnsCorrectResult()
 {
     // Fixture setup
     var delegateRequest = typeof(Func<int>);
     var sut = new DelegateGenerator();
     // Exercise system
     var dummyContainer = new DelegatingSpecimenContext();
     var result = sut.Create(delegateRequest, dummyContainer);
     // Verify outcome
     Assert.IsType<Func<int>>(result);
     // Teardown
 }
 public void CreateWithVoidParameterlessDelegateRequestReturnsDelegateNotThrowing()
 {
     // Fixture setup
     var delegateRequest = typeof(Action);
     var sut = new DelegateGenerator();
     // Exercise system
     var dummyContainer = new DelegatingSpecimenContext();
     var result = sut.Create(delegateRequest, dummyContainer);
     // Verify outcome
     Assert.DoesNotThrow(() => ((Action)result).Invoke());
     // Teardown
 }