public void CreateReturnsResultFromInjectedHandlerWhenRequestIsMatched() { // Fixture setup var builder = new DelegatingSpecimenBuilder() { OnCreate = (r, ctx) => ctx.Resolve(r) }; var request = new object(); var expected = new object(); var handlerStub = new DelegatingRecursionHandler { OnHandleRecursiveRequest = (r, rs) => { Assert.Equal(request, r); Assert.NotNull(rs); return expected; } }; var comparer = new DelegatingEqualityComparer { OnEquals = (x, y) => true }; var sut = new RecursionGuard(builder, handlerStub, comparer, 1); var context = new DelegatingSpecimenContext(); context.OnResolve = r => sut.Create(r, context); // Exercise system var actual = sut.Create(request, context); // Verify outcome Assert.Equal(expected, actual); // Teardown }
public void CreateOnMultipleThreadsConcurrentlyWorks() { // Fixture setup var dummyBuilder = new DelegatingSpecimenBuilder { OnCreate = (r, ctx) => ctx.Resolve(r) }; var dummyHandler = new DelegatingRecursionHandler(); var sut = new RecursionGuard(dummyBuilder, dummyHandler); var dummyContext = new DelegatingSpecimenContext() { OnResolve = (r) => 99 }; // Exercise system int[] specimens = Enumerable.Range(0, 1000) .AsParallel() .WithDegreeOfParallelism(8) .WithExecutionMode(ParallelExecutionMode.ForceParallelism) .Select(x => (int)sut.Create(typeof(int), dummyContext)) .ToArray(); // Verify outcome Assert.Equal(1000, specimens.Length); Assert.True(specimens.All(s => s == 99)); // Teardown }