/// <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 }