private static bool RunAssertions <T>(TypedSpecification <T> spec, RunResult result, object fromWhen) { bool allOk = true; foreach (var exp in spec.GetAssertions()) { var partiallyApplied = PartialApplicationVisitor.Apply(exp, fromWhen); try { PAssert.IsTrue(partiallyApplied); result.Expectations.Add(new ExpectationResult { Passed = true, Text = PAssert.CreateSimpleFormatFor(partiallyApplied), OriginalExpression = exp }); } catch (Exception ex) { allOk = false; result.Expectations.Add(new ExpectationResult { Passed = false, Text = PAssert.CreateSimpleFormatFor(partiallyApplied), OriginalExpression = exp, Exception = ex }); } } return(allOk); }
public static Expression <Func <bool> > Apply <T>(Expression <Func <T, bool> > expr, object value) { var paramExprToReplace = expr.Parameters[0]; var valueToApply = Expression.Constant(value, value.GetType()); var visitor = new PartialApplicationVisitor(paramExprToReplace, valueToApply); var oldBody = expr.Body; var newBody = visitor.Visit(oldBody); return(Expression.Lambda <Func <bool> >(newBody)); }
private RunResult Run <T>(TypedSpecification <T> spec) { var result = new RunResult { SpecificationName = spec.GetName() }; try { var before = spec.GetBefore(); before.InvokeIfNotNull(); } catch (Exception ex) { result.MarkFailure("Before Failed", ex.InnerException); return(result); } object sut = null; try { var given = spec.GetOn(); sut = given.DynamicInvoke(); result.On = given; } catch (Exception ex) { result.MarkFailure("On Failed", ex.InnerException); } object whenResult = null; Delegate when; try { when = spec.GetWhen(); if (when == null) { return new RunResult { SpecificationName = spec.GetName(), Passed = false, Message = "No when on specification" } } ; if (when.Method.GetParameters().Length == 1) { whenResult = when.DynamicInvoke(new[] { sut }); } else { whenResult = when.DynamicInvoke(); } if (when.Method.ReturnType != typeof(void)) { result.Result = whenResult; } else { result.Result = sut; } } catch (Exception ex) { result.MarkFailure("When Failed", ex.InnerException); return(result); } var fromWhen = when.Method.ReturnType == typeof(void) ? sut : whenResult; bool allOk = true; foreach (var exp in spec.GetAssertions()) { var partiallyApplied = PartialApplicationVisitor.Apply(exp, fromWhen); try { PAssert.IsTrue(partiallyApplied); result.Expectations.Add(new ExpectationResult { Passed = true, Text = PAssert.CreateSimpleFormatFor(partiallyApplied), OriginalExpression = exp }); } catch (Exception ex) { allOk = false; result.Expectations.Add(new ExpectationResult { Passed = false, Text = PAssert.CreateSimpleFormatFor(partiallyApplied), OriginalExpression = exp, Exception = ex }); } } try { var Finally = spec.GetFinally(); Finally.InvokeIfNotNull(); } catch (Exception ex) { allOk = false; result.Message = "Finally failed"; result.Thrown = ex.InnerException; } result.Passed = allOk; return(result); }