/// <summary> /// Creates a new array based on a request. /// </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> /// <returns> /// An array of the requested type if possible; otherwise a <see cref="NoSpecimen"/> /// instance. /// </returns> /// <remarks> /// <para> /// If <paramref name="request"/> is a request for an array and <paramref name="context"/> /// can satisfy a <see cref="MultipleRequest"/> for the element type, the return value is a /// populated array of the requested type. If not, the return value is a /// <see cref="NoSpecimen"/> instance. /// </para> /// </remarks> public object Create(object request, ISpecimenContext context) { if (context == null) { throw new ArgumentNullException("context"); } // This is performance-sensitive code when used repeatedly over many requests. // See discussion at https://github.com/AutoFixture/AutoFixture/pull/218 var type = request as Type; if (type == null) { return(new NoSpecimen(request)); } if (!type.IsArray) { return(new NoSpecimen(request)); } var elementType = type.GetElementType(); var elements = context.Resolve(new MultipleRequest(elementType)) as IEnumerable; if (elements == null) { return(new NoSpecimen(request)); } return(ArrayRelay.ToArray(elements, elementType)); }
public void SutIsSpecimenBuilder() { // Fixture setup // Exercise system var sut = new ArrayRelay(); // Verify outcome Assert.IsAssignableFrom<ISpecimenBuilder>(sut); // Teardown }
public void CreateWithNullContextThrows() { // Fixture setup var sut = new ArrayRelay(); var dummyRequest = new object(); // Exercise system and verify outcome Assert.Throws<ArgumentNullException>(() => sut.Create(dummyRequest, null)); // Teardown }
public void CreateWithNoneArrayRequestReturnsCorrectResult(object request) { // Fixture setup var sut = new ArrayRelay(); // Exercise system var dummyContext = new DelegatingSpecimenContext(); var result = sut.Create(request, dummyContext); // Verify outcome var expectedResult = new NoSpecimen(request); Assert.Equal(expectedResult, result); // Teardown }
public void CreateWithArrayRequestReturnsCorrectResult(Type request, Type itemType) { // Fixture setup var expectedRequest = new MultipleRequest(itemType); object expectedResult = Array.CreateInstance(itemType, 0); var context = new DelegatingSpecimenContext { OnResolve = r => expectedRequest.Equals(r) ? expectedResult : new NoSpecimen(r) }; var sut = new ArrayRelay(); // Exercise system var result = sut.Create(request, context); // Verify outcome Assert.Equal(expectedResult, result); // Teardown }
public void CreateConvertsEnumerableToArray() { // Fixture setup var request = typeof(int[]); var expectedRequest = new MultipleRequest(typeof(int)); var enumerable = Enumerable.Range(1, 3); var context = new DelegatingSpecimenContext { OnResolve = r => expectedRequest.Equals(r) ? (object)enumerable : new NoSpecimen(r) }; var sut = new ArrayRelay(); // Exercise system var result = sut.Create(request, context); // Verify outcome var a = Assert.IsAssignableFrom<int[]>(result); Assert.True(enumerable.SequenceEqual(a)); // Teardown }
/// <summary> /// Creates a new array based on a request. /// </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> /// <returns> /// An array of the requested type if possible; otherwise a <see cref="NoSpecimen"/> /// instance. /// </returns> /// <remarks> /// <para> /// If <paramref name="request"/> is a request for an array and <paramref name="context"/> /// can satisfy a <see cref="MultipleRequest"/> for the element type, the return value is a /// populated array of the requested type. If not, the return value is a /// <see cref="NoSpecimen"/> instance. /// </para> /// </remarks> public object Create(object request, ISpecimenContext context) { if (context == null) { throw new ArgumentNullException("context"); } return((from t in request.Maybe().OfType <Type>() where t.IsArray let elementType = t.GetElementType() let e = context.Resolve(new MultipleRequest(elementType)) as IEnumerable where e != null select ArrayRelay.ToArray(e, elementType)) .DefaultIfEmpty(new NoSpecimen(request)) .Single()); }
public void CreateReturnsCorrectResultWhenContextReturnsNonEnumerableResult(object response) { // Fixture setup var request = typeof(object[]); var context = new DelegatingSpecimenContext { OnResolve = r => response }; var sut = new ArrayRelay(); // Exercise system var result = sut.Create(request, context); // Verify outcome var expectedResult = new NoSpecimen(request); Assert.Equal(expectedResult, result); // Teardown }