public void TryCatchWhenTest()
        {
            var expected = new InvalidOperationException("aaa");

            _mock.MethodWithReturn().Throws(expected);
            _mock.Condition.Returns(true);

            var parameter = ExpressionShortcuts.Parameter <IMock>();
            var action    = ExpressionShortcuts.Block()
                            .Parameter(parameter)
                            .Line(parameter.Assign(_mock))
                            .Line(ExpressionShortcuts.Try()
                                  .Body(parameter.Call(o => o.MethodWithReturn()))
                                  .Catch <InvalidOperationException>(
                                      e => ExpressionShortcuts.Null <string>(),
                                      e => e.Call(o => !parameter.Property(x => x.Condition) || o.Message == null)
                                      )
                                  )
                            .Lambda <Func <string> >()
                            .Compile();

            var actual = Assert.Throws <InvalidOperationException>(() => action());

            Assert.Equal(expected, actual);

            _mock.Received(1).MethodWithReturn();
            _ = _mock.Received(1).Condition;
        }
示例#2
0
        public void NestedCallWithPropertyTest()
        {
            var expected = _faker.Random.String();

            _mock.String.Returns(expected);
            var mock = ExpressionShortcuts.Parameter <IMock>();

            Action action;

            action = ExpressionShortcuts.Block()
                     .Parameter(mock)
                     .Line(mock.Assign(_mock))
                     .Line(mock.Call(o => o.VoidMethodWithParameter(o.String)))
                     .Lambda <Action>()
                     .Compile();

            _mock.DidNotReceiveWithAnyArgs().VoidMethodWithParameter(default);
示例#3
0
        public static Expression <Action <BindingContext, TextWriter, object> > Bind(CompilationContext context, Expression body, string templatePath)
        {
            var configuration = ExpressionShortcuts.Arg(context.Configuration);

            var writerParameter = ExpressionShortcuts.Parameter <TextWriter>("buffer");
            var objectParameter = ExpressionShortcuts.Parameter <object>("data");

            var bindingContext          = ExpressionShortcuts.Arg <BindingContext>(context.BindingContext);
            var inlinePartialsParameter = ExpressionShortcuts.Null <IDictionary <string, Action <TextWriter, object> > >();
            var textEncoder             = configuration.Property(o => o.TextEncoder);
            var encodedWriterExpression = ExpressionShortcuts.Call(() => EncodedTextWriter.From(writerParameter, (ITextEncoder)textEncoder));
            var parentContextArg        = ExpressionShortcuts.Var <BindingContext>("parentContext");

            var newBindingContext = ExpressionShortcuts.Call(
                () => BindingContext.Create(configuration, objectParameter, encodedWriterExpression, parentContextArg, templatePath, (IDictionary <string, Action <TextWriter, object> >)inlinePartialsParameter)
                );

            var shouldDispose = ExpressionShortcuts.Var <bool>("shouldDispose");

            Expression blockBuilder = ExpressionShortcuts.Block()
                                      .Parameter(bindingContext)
                                      .Parameter(shouldDispose)
                                      .Line(ExpressionShortcuts.Condition()
                                            .If(objectParameter.Is <BindingContext>(),
                                                bindingContext.Assign(objectParameter.As <BindingContext>())
                                                )
                                            .Else(block =>
            {
                block.Line(shouldDispose.Assign(true));
                block.Line(bindingContext.Assign(newBindingContext));
            })
                                            )
                                      .Line(ExpressionShortcuts.Try()
                                            .Body(block => block.Lines(((BlockExpression)body).Expressions))
                                            .Finally(ExpressionShortcuts.Condition()
                                                     .If(shouldDispose, bindingContext.Call(o => o.Dispose()))
                                                     )
                                            );

            return(Expression.Lambda <Action <BindingContext, TextWriter, object> >(blockBuilder, (ParameterExpression)parentContextArg.Expression, (ParameterExpression)writerParameter.Expression, (ParameterExpression)objectParameter.Expression));
        }