public void Should_return_equality_constraint_when_trapper_doesnt_produce_any_constraint()
        {
            // Arrange
            A.CallTo(() => this.trapper.TrapConstraints(A <Action> ._))
            .Returns(Enumerable.Empty <IArgumentConstraint>());

            // Act
            var result = this.factory.GetArgumentConstraint(BuilderForParsedArgumentExpression.Build(x => x.WithConstantExpression("foo")));

            // Assert
            Assert.That(result, Is.InstanceOf <EqualityArgumentConstraint>().And.Property("ExpectedValue").EqualTo("foo"));
        }
        public void Should_return_equality_constraint_when_trapper_does_not_produce_any_constraint()
        {
            // Arrange
            A.CallTo(() => this.trapper.TrapConstraints(A <Action> ._))
            .Returns(Enumerable.Empty <IArgumentConstraint>());

            // Act
            var result = this.factory.GetArgumentConstraint(BuilderForParsedArgumentExpression.Build(x => x.WithConstantExpression("foo")));

            // Assert
            result.Should().BeOfType <EqualityArgumentConstraint>().Which.ExpectedValue.Should().Be("foo");
        }
        public void Should_return_constraint_from_trapper_when_available()
        {
            // Arrange
            var constraint = A.Dummy <IArgumentConstraint>();

            Any.CallTo(this.trapper).WithReturnType <IEnumerable <IArgumentConstraint> >().Returns(new[] { constraint });

            // Act
            var result = this.factory.GetArgumentConstraint(BuilderForParsedArgumentExpression.BuildWithDefaults());

            // Assert
            Assert.That(result, Is.SameAs(constraint));
        }
        public void Should_not_invoke_expression_more_than_once()
        {
            // Arrange
            int invokedNumberOfTimes = 0;
            var invokation           = FuncFromAction(() => invokedNumberOfTimes++);

            var expression = BuilderForExpression.GetBody(() => invokation());

            this.StubTrapperToReturnNoConstraints();

            // Act
            this.factory.GetArgumentConstraint(BuilderForParsedArgumentExpression.Build(x => x.WithExpression(expression)));

            // Assert
            Assert.That(invokedNumberOfTimes, Is.EqualTo(1));
        }
        public void Should_not_invoke_expression_more_than_once()
        {
            // Arrange
            ExpressionArgumentConstraintFactory factory = new ExpressionArgumentConstraintFactory(new ArgumentConstraintTrap());
            int           invokedNumberOfTimes          = 0;
            Func <object> invocation = () =>
            {
                invokedNumberOfTimes++;
                return(null);
            };
            var expression = BuilderForExpression.GetBody(() => invocation());

            // Act
            factory.GetArgumentConstraint(BuilderForParsedArgumentExpression.Build(x => x.WithExpression(expression)));

            // Assert
            invokedNumberOfTimes.Should().Be(1);
        }
        public void Should_pass_action_that_invokes_expression_to_trapper()
        {
            // Arrange
            bool wasInvoked = false;
            var  invokation = FuncFromAction(() => wasInvoked = true);

            var expression = BuilderForExpression.GetBody(() => invokation());

            // Act
            this.factory.GetArgumentConstraint(BuilderForParsedArgumentExpression.Build(x => x.WithExpression(expression)));

            // Assert
            var actionToTrapper = Fake.GetCalls(this.trapper).Single().GetArgument <Action>(0);

            wasInvoked = false;
            actionToTrapper.Invoke();

            Assert.That(wasInvoked, Is.True);
        }
 private ParsedArgumentExpression FromExpression(Expression <Action> fromFirstArgumentInCall)
 {
     return(BuilderForParsedArgumentExpression.Build(x => x.FromFirstArgumentInMethodCall(fromFirstArgumentInCall)));
 }