示例#1
0
        public void Should_not_fail_when_reporting_trapped_constraint_outside_call_to_trap_constraints()
        {
            // Arrange

            // Act, Assert
            Assert.DoesNotThrow(() => ArgumentConstraintTrap.ReportTrappedConstraint(A.Dummy <IArgumentConstraint>()));
        }
        public void Should_fail_when_reporting_trapped_constraint_outside_call_to_trap_constraints()
        {
            // Act
            var exception = Record.Exception(
                () => ArgumentConstraintTrap.ReportTrappedConstraint(A.Dummy <IArgumentConstraint>()));

            // Assert
            exception.Should().BeAnExceptionOfType <InvalidOperationException>().WithMessage("A<T>.Ignored, A<T>._, and A<T>.That can only be used in the context of a call specification with A.CallTo()");
        }
示例#3
0
        public void Should_track_constraints_supplied_in_calls_made_from_overlapping_threads()
        {
            // Ensures that constraints are properly trapped even when two constraint-trapping threads
            // overlap. Uses the reset events to ensure that the threads consistently execute like this:
            // |-----------------------------|
            //       |---------------|
            // The thread that starts first will register to trap constraints before the second thread
            // but will not actually report the constraint until after the second thread has reported
            // its constraint and finished.
            // Without per-thread constraint trapping, this would mean that the first thread's constraint
            // would be lost.

            // Arrange
            var lateStartingLock = new ManualResetEventSlim(false);
            var lateEndingLock   = new ManualResetEventSlim(false);

            var earlyStartingConstraint = A.Fake <IArgumentConstraint>();

            A.CallTo(() => earlyStartingConstraint.ToString()).Returns("earlyStarter");
            IArgumentConstraint?earlyStartingResult = null;

            var lateStartingConstraint = A.Fake <IArgumentConstraint>();

            A.CallTo(() => lateStartingConstraint.ToString()).Returns("lateStarter");
            IArgumentConstraint?lateStartingResult = null;

            // Act
            var earlyStartingTask = Task.Run(() =>
            {
                earlyStartingResult = this.trap.TrapConstraintOrCreate(
                    () =>
                {
                    lateStartingLock.Set();
                    lateEndingLock.Wait();

                    ArgumentConstraintTrap.ReportTrappedConstraint(earlyStartingConstraint);
                },
                    UnusedConstraintFactory);
            });

            var lateStartingTask = Task.Run(() =>
            {
                lateStartingLock.Wait();

                lateStartingResult = this.trap.TrapConstraintOrCreate(
                    () => ArgumentConstraintTrap.ReportTrappedConstraint(lateStartingConstraint),
                    UnusedConstraintFactory);

                lateEndingLock.Set();
            });

            Task.WaitAll(earlyStartingTask, lateStartingTask);

            // Assert
            new[] { earlyStartingResult, lateStartingResult }
            .Should().Equal(earlyStartingConstraint, lateStartingConstraint);
        }
        public void Should_not_fail_when_reporting_trapped_constraint_outside_call_to_trap_constraints()
        {
            // Act
            var exception = Record.Exception(
                () => ArgumentConstraintTrap.ReportTrappedConstraint(A.Dummy <IArgumentConstraint>()));

            // Assert
            exception.Should().BeNull();
        }
        public void Should_return_constraints_that_has_been_trapped()
        {
            // Arrange
            var constraint1 = A.Dummy <IArgumentConstraint>();
            var constraint2 = A.Dummy <IArgumentConstraint>();

            // Act
            var result = this.trap.TrapConstraints(() =>
            {
                ArgumentConstraintTrap.ReportTrappedConstraint(constraint1);
                ArgumentConstraintTrap.ReportTrappedConstraint(constraint2);
            });

            // Assert
            result.Should().BeEquivalentTo(constraint1, constraint2);
        }
        public void Should_not_return_constraints_from_previous_call()
        {
            // Arrange
            var constraint1 = A.Dummy <IArgumentConstraint>();
            var constraint2 = A.Dummy <IArgumentConstraint>();

            this.trap.TrapConstraints(() => ArgumentConstraintTrap.ReportTrappedConstraint(constraint1));

            // Act
            var result = this.trap.TrapConstraints(() =>
            {
                ArgumentConstraintTrap.ReportTrappedConstraint(constraint2);
            });

            // Assert
            result.Should().BeEquivalentTo(constraint2);
        }
示例#7
0
        public static void RegisterDependencies(IServiceRegistrar registrar)
        {
            var bootstrapper = BootstrapperLocator.FindBootstrapper();

            var typeCatalogue      = new TypeCatalogue();
            var assemblyFilesNames = bootstrapper.GetAssemblyFileNamesToScanForExtensions()
                                     ?? throw new InvalidOperationException(ExceptionMessages.GetAssemblyFileNamesToScanForExtensionsShouldntReturnNull);

            typeCatalogue.Load(assemblyFilesNames);
            var typeCatalogueInstanceProvider = new TypeCatalogueInstanceProvider(typeCatalogue);

            var argumentValueFormatters = typeCatalogueInstanceProvider.InstantiateAllOfType <IArgumentValueFormatter>();
            var dummyFactories          = typeCatalogueInstanceProvider.InstantiateAllOfType <IDummyFactory>();
            var fakeOptionsBuilders     = typeCatalogueInstanceProvider.InstantiateAllOfType <IFakeOptionsBuilder>();

            var implicitOptionsBuilderCatalogue = new ImplicitOptionsBuilderCatalogue(fakeOptionsBuilders);

            var methodInfoManager      = new MethodInfoManager();
            var argumentConstraintTrap = new ArgumentConstraintTrap();
            var expressionArgumentConstraintFactory = new ExpressionArgumentConstraintFactory(argumentConstraintTrap);

            var fakeManagerAccessor = new DefaultFakeManagerAccessor();

            var fakeObjectCreator = new FakeObjectCreator(
                FakeCallProcessorProviderFactory,
                new CastleDynamicProxyInterceptionValidator(methodInfoManager),
                new DelegateProxyInterceptionValidator());

            var callExpressionParser = new CallExpressionParser();

            var interceptionAsserter = new DefaultInterceptionAsserter(fakeObjectCreator);

            var argumentValueFormatter = new ArgumentValueFormatter(argumentValueFormatters);

            var fakeObjectCallFormatter = new DefaultFakeObjectCallFormatter(argumentValueFormatter, fakeManagerAccessor);

            var callWriter = new CallWriter(fakeObjectCallFormatter, new FakeCallEqualityComparer());

            var configurationFactory = new ConfigurationFactory(RuleBuilderFactory);

            registrar.Register <IExpressionCallMatcherFactory>(new ExpressionCallMatcherFactory(expressionArgumentConstraintFactory, methodInfoManager));

            registrar.Register(expressionArgumentConstraintFactory);

            registrar.Register <FakeAndDummyManager>(
                new FakeAndDummyManager(
                    new DummyValueResolver(new DynamicDummyFactory(dummyFactories), fakeObjectCreator),
                    fakeObjectCreator,
                    implicitOptionsBuilderCatalogue));

            registrar.Register <IArgumentConstraintManagerFactory>(new ArgumentConstraintManagerFactory());

            registrar.Register(new EventHandlerArgumentProviderMap());

            registrar.Register <SequentialCallContext.Factory>(SequentialCallContextFactory);

            registrar.Register <IStartConfigurationFactory>(
                new StartConfigurationFactory(ExpressionCallRuleFactory, configurationFactory, callExpressionParser, interceptionAsserter));

            registrar.Register <IFakeConfigurationManager>(
                new FakeConfigurationManager(configurationFactory, ExpressionCallRuleFactory, callExpressionParser, interceptionAsserter));

            registrar.Register <IFakeManagerAccessor>(fakeManagerAccessor);

            registrar.Register <ICallExpressionParser>(callExpressionParser);

            registrar.Register((StringBuilderOutputWriter.Factory)StringBuilderOutputWriterFactory);

            registrar.Register <IFakeObjectCallFormatter>(fakeObjectCallFormatter);

            StringBuilderOutputWriter StringBuilderOutputWriterFactory() =>
            new StringBuilderOutputWriter(argumentValueFormatter !);

            FakeManager FakeManagerFactory(Type fakeObjectType, object proxy, string?name) =>
            new FakeManager(fakeObjectType, proxy, name);

            IFakeCallProcessorProvider FakeCallProcessorProviderFactory(Type typeOfFake, IProxyOptions proxyOptions) =>
            new FakeManagerProvider(FakeManagerFactory, fakeManagerAccessor, typeOfFake, proxyOptions);

            ExpressionCallRule ExpressionCallRuleFactory(ParsedCallExpression callSpecification) =>
            new ExpressionCallRule(new ExpressionCallMatcher(callSpecification, expressionArgumentConstraintFactory, methodInfoManager));

            IFakeAsserter FakeAsserterFactory(IEnumerable <CompletedFakeObjectCall> calls, int lastSequenceNumber) =>
            new FakeAsserter(calls, lastSequenceNumber, callWriter, StringBuilderOutputWriterFactory);

            SequentialCallContext SequentialCallContextFactory() =>
            new SequentialCallContext(callWriter, StringBuilderOutputWriterFactory);

            RuleBuilder RuleBuilderFactory(BuildableCallRule rule, FakeManager fake) =>
            new RuleBuilder(rule, fake, FakeAsserterFactory);
        }